Powershell 改变';标准误差';至';标准输出';

Powershell 改变';标准误差';至';标准输出';,powershell,stdout,stderr,Powershell,Stdout,Stderr,我有一个PowerShell脚本,可以写入错误输出。脚本可以简单到如下所示: Write-Error 'foo' Start-Sleep -s 5 Write-Error 'bar' 我实际调用的脚本生成一个外部进程,该进程需要一段时间来处理并写入标准错误 现在,当我这样调用脚本时: . myScript.ps1 Write-Host ( . myScript.ps1 2>&1 ) foo bar 我通过PowerShell的常规行为(即红色文本和大量调试信息)收到错误消息

我有一个PowerShell脚本,可以写入错误输出。脚本可以简单到如下所示:

Write-Error 'foo'
Start-Sleep -s 5
Write-Error 'bar'
我实际调用的脚本生成一个外部进程,该进程需要一段时间来处理并写入标准错误

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

. myScript.ps1
Write-Host ( . myScript.ps1 2>&1 )
foo bar
我通过PowerShell的常规行为(即红色文本和大量调试信息)收到错误消息。由于该文本与我的实际应用程序中的PowerShell无关,因此我不需要这些调试信息,它只会降低结果的可读性(并且无法处理)

有没有办法将输出直接重定向到标准输出,这样我就可以得到文本

我试过这样的方法:

. myScript.ps1
Write-Host ( . myScript.ps1 2>&1 )
foo bar
但这会延迟输出,直到一切都完成

关于“调试信息”,当我现在运行脚本时,输出如下(红色):

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

更接近我的实际问题(因为用纯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}

作业正确启动,并且在后台也可以正常工作,但当我想通过
接收作业
检查其进度时,我一开始根本没有得到任何输出,在脚本/程序完成后(即5秒后),我得到以下输出(再次以红色显示):

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

尝试:

$erroractionpreference = "silentlycontinue"
.\myscript.ps1
根据问题的编辑部分,这应该是合适的:

. MyScript.ps1 2>&1 | %{ Write-Host $_ }
它只写“foo”和“bar”,它们一出现就出现

编辑

实际上,这更简单,效果也很好:

. MyScript.ps1 2>&1 | Write-Host
但我保留原来的答案。该代码允许动态地处理输出(
$)\uu
)并执行其他操作(即,不只是将其写入主机)

编辑2

写入STDERR的外部程序:

using System;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            for (int i = 0; i < 100; ++i)
            {
                Console.Error.WriteLine("Step " + i);
                System.Threading.Thread.Sleep(2000);
            }
        }
    }
}
该脚本完全满足您的需要(用于编辑2部分):它会在输出可用时立即显示输出,并且不会显示不需要的额外错误信息

另外,这个版本也适用:

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

对不起,我不明白你的问题。你能控制脚本的代码吗?为什么要使用
写入错误
?你在说什么调试信息?我正在使用一个我无法控制的命令行程序。该程序通过标准错误输出返回其所有信息。但是,当您访问PowerShell中的标准错误输出时,PowerShell会向其中添加调试信息,这真的很烦人(比较
写入错误测试
写入主机测试
)。我基本上希望写入错误输出的输出出现在标准输出中,这样我就可以正确地使用它了。我需要访问程序/脚本写入错误输出的内容,因为这是从中获取实际信息的唯一方法。虽然这会将标准错误重定向到正确输出,但这也会延迟实际输出,直到脚本完成。请参阅问题中的“我的编辑2”部分,了解我实际需要的更多信息。您不断更改问题:)。期待编辑3部分。我也期待着它,但它似乎不再是必要的,因为你的解决方案工作得很好!非常感谢!:)