Powershell将stderr和stdout重定向到两个不同的地方

Jam*_*all 3 powershell redirect stdout stderr

如何重定向

  • stderr到logfile
  • stdout to object

我看过的事情:

>>并且2>>只能重定向到文件.
-RedirectStandardOutput并且-RedirectStandardError只能再次重定向到文件.
| Out-File无法重定向stderr.
| Tee-Object同样的问题.

Jos*_*efZ 7

全面的解释在MSDN的about_Redirection文章中。

一个最小、完整且可验证的示例stdout用于管道):

PS D:\PShell> -1,5,0,2| ForEach-Object { 15/$_ } 2>"$env:temp\err.txt" | Write-Output
-15
3
7.5

PS D:\PShell> Get-Content "$env:temp\err.txt"
Attempted to divide by zero.
At line:1 char:28
+ -1,5,0,2| ForEach-Object { 15/$_ } 2>"$env:temp\err.txt" | Write-Outpu ...
+                            ~~~~~
    + CategoryInfo          : NotSpecified: (:) [], RuntimeException
    + FullyQualifiedErrorId : RuntimeException


PS D:\PShell> 
Run Code Online (Sandbox Code Playgroud)

另一个例子(stdout反对):

PS D:\PShell> $x = -1,5,0,2| ForEach-Object { 15/$_} 2>"$env:temp\err.txt"

PS D:\PShell> $x
-15
3
7.5
Run Code Online (Sandbox Code Playgroud)


von*_*ryz 6

加入stdoutstderr输出流的工作方式与PetSerAl一样,虽然语法不是最直观的.

奇怪的语法2>&1意味着stderr(流2)将被添加到stdout(流1)中.由于这实际上并不是您所追求的,请尝试将MS页面中的其他示例调整为Powershell:

或者,您可以将输出重定向到一个位置,将错误重定向到另一个位置.

dir file.xxx> output.msg 2> output.err

从而,

$ret = myCommand 2> errors.log
Run Code Online (Sandbox Code Playgroud)

应该在日志文件中发送错误并在$ret变量中发送非错误.