2017-07-13 62 views
2

我想將除流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做些事情,但是這會創建額外的文本,並且會用不必要的文本填充輸出文件。

我閱讀下面的文章,但我沒有找到合適的答案

回答

2

一個務實的解決方法是使用普通-ov-OutVariable參數,這使得能夠可變收集獨立的如何/是否成功流重定向小命令的成功輸出,:

'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]實例,即使只收到單個項目。
This may change in v6


順便說一句,你的命令更有效的重新配製是:

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