sách gpt4 ai đã đi

powershell - 将 'standard error' 更改为 'standard output'

In lại 作者:行者123 更新时间:2023-12-03 16:51:54 31 4
mua khóa gpt4 Nike

我有一个写入错误输出的 PowerShell 脚本。该脚本可以简单如下:

Write-Error 'foo'
Start-Sleep -s 5
Write-Error 'bar'

我实际调用的脚本产生了一个外部进程,该进程需要一段时间来处理并写入标准错误。

现在,当我这样调用脚本时:
. myScript.ps1

我收到了 PowerShell 通常行为的错误消息(即红色文本和大量调试信息)。由于该文本在我的实际应用程序中与 PowerShell 无关,因此我不需要这些调试信息,它只会降低结果的可读性(并且无法处理)。

有没有办法将该输出直接重定向到标准输出,以便我只获取文本?

我试过这样的事情:
Write-Host ( . myScript.ps1 2>&1 )

但这会延迟输出,直到一切都完成。

关于“调试信息”,当我现在运行脚本时,输出看起来像这样(红色):
C:\path\to\myScript.ps1 : foo
Bei Zeile:1 Zeichen:2
+ . <<<< 'C:\path\to\myScript.ps1'
+ CategoryInfo : NotSpecified: (:) [Write-Error], WriteErrorException
+ FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,myScript.ps1

C:\path\to\myScript.ps1 : bar
Bei Zeile:1 Zeichen:2
+ . <<<< 'C:\path\to\myScript.ps1'
+ CategoryInfo : NotSpecified: (:) [Write-Error], WriteErrorException
+ FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,myScript.ps1

当我使用 Write-Host ( . myScript.ps1 2>&1 ) 运行脚本时,其中错误输出写入标准输出,我得到这样的结果:
foo bar

这正是我想要的输出,除了 Write-Host (..)使输出仅在脚本终止后出现,因此我无法收到有关所述脚本进度的任何信息。

实际上更接近我的实际问题(因为很难用纯 PowerShell 来解释);我有以下 Python 脚本,它大致类似于我使用的命令行程序所做的事情,即它进行一些处理并将进度打印到标准错误:
#!/usr/bin/python
import sys, time
sys.stderr.write( 'Progressing... ' )
sys.stderr.flush()
time.sleep( 5 )
sys.stderr.write( 'done.\n' )
sys.stderr.flush()

现在,当我用 python script.py 调用它时,它正常工作并打印出“progressing”行,等待 5 秒,然后将“done”打印到 PowerShell(作为普通文本)。现在的问题是我想在作业中运行它,如下所示: Start-Job { python script.py } .

作业正确启动,并且在后台运行良好,但是当我想通过 Receive-Job 检查其进度时,一开始我根本没有输出,在脚本/程序完成后(即 5 秒后),我得到以下输出(再次以红色显示):
Progressing... done.
+ CategoryInfo : NotSpecified: (Progressing... done.:String) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError

显然,这不是我想要得到的。相反,我想获得打印到标准错误的实际输出,既是实时的(即在脚本中发生时),也没有与 PowerShell 相关的调试文本。

1 Câu trả lời

根据问题的编辑部分,这应该是合适的:

. MyScript.ps1 2>&1 | %{ Write-Host $_ }

它只写“foo”和“bar”,它们一发生就出现。

biên tập

实际上,这更简单,也可以正常工作:
. MyScript.ps1 2>&1 | Write-Host

但我保留原来的答案。该代码允许动态处理输出( $_ )并执行其他操作(即不仅仅是将其写入主机)。

Sửa đổi 2

写入 STDERR 的外部程序:
using System;
namespace ConsoleApplication1
{
class Program
{
void tĩnh Main(string[] args)
{
for (int i = 0; i < 100; ++i)
{
Console.Error.WriteLine("Step " + i);
System.Threading.Thread.Sleep(2000);
}
}
}
}

将此应用程序作为作业启动并定期接收其输出的脚本。
$ErrorActionPreference = 'continue'

$job = Start-Job { C:\TEMP\Test\ConsoleApplication1.exe 2>&1 }
for(;;) {
Receive-Job $job | Write-Host
Start-Sleep 2
}

该脚本完全符合您的需要(对于您的编辑 2 部分):它会在输出可用时立即显示,并且不会显示不需要的额外错误信息。

附言这个版本也有效:
$job = Start-Job { C:\TEMP\Test\ConsoleApplication1.exe }
for(;;) {
Receive-Job $job 2>&1 | Write-Host
Start-Sleep 2
}

关于powershell - 将 'standard error' 更改为 'standard output',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6163498/

31 4 0
行者123
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com