将除成功流之外的所有输出流重定向到文件

时间:2017-07-13 12:01:54

标签: powershell redirect

我想将除流1(成功)之外的所有PowerShell cmdlet输出重定向到文件。我怎样才能实现这一目标?我知道如何实现重定向单个流,我知道如何将其合并到标准输出,但我不想弄乱标准输出。我只想将流2,3 4和(可选)5捕获到一个文件中。我正在使用Windows平台。

例如,我使用了这些命令:

@('c:\temp\', 'c:\temp2\') | % {Get-ChildItem $_}

我的c:\ temp文件夹里面有一些文件,我没有c:\ temp2文件夹。所以我在文件中的预期输出只是得到关于丢失文件夹temp2的错误。

我尝试为变量赋值,但它没有帮助。正常分配不会生成输出,但会出现重定向输出。

($Files = @('c:\temp\', 'c:\temp2\') | % {Get-ChildItem $_}) *>err.txt

没有重定向,我只看到c:\ temp2不存在的错误。但是一旦重定向,C:\ temp中的文件列表就出现在err.txt中。而且,它出现在文件的末尾。此外,ISE环境中$Files的分配没有发生!?在其他主机中,分配工作正常,但重定向也是将文件添加到输出。

如果我尝试重定向为3>err.txt 2>err.txt,它将失败并显示:该进程无法访问文件err.txt,因为它正由另一个进程使用。

不支持合并到除1之外的任何其他流。此尝试3>&2 2>err.txt会出现错误:' 3>& 2'运营商留作将来使用。

我能够使用Start-Transcript执行某些操作,但这会创建其他文本,并且会使输出文件充满不必要的文本。

我正在阅读以下文章,但我找不到合适的答案

1 个答案:

答案 0 :(得分:2)

实用的解决方法是使用常见的 -ov-OutVariable参数,该参数可以收集cmdlet的成功输出变量,与成功流重定向的方式/是否相关无关

'c:\temp\', 'c:\temp2\' | % { Get-ChildItem $_ } -ov Files 1>$null *>err.txt
# Get-ChildItem success output is now stored in $Files
  • 1>$null会抑制成功流

  • *>err.txt将剩余的流重定向到文件err.txt

  • 请注意Files而不是$Files如何传递给-ov,因为您必须传递变量的名称,而不是其值。

需要注意的是,为-ov指定的变量接收整个输出并将其存储在内存中,这对于大输出集可能会有问题。

此外,从PSv5.1开始,请注意输出变量总是[System.Collections.ArrayList]个实例,即使只收到一个项目。
may change in v6

顺便说一下,你的命令的更有效的重新制定是:

Get-ChildItem c:\temp\, c:\temp2\ -ov Files 1>$null *>err.txt