如果你打開一個命令提示符,然後輸入:批處理腳本:爲什麼重定向標準輸出不能在這種情況下工作?
echo foobar > nul
它將打印什麼,因爲nul
燕子所有輸入的。但是,如果你使用PowerShell運行命令:
powershell "echo foobar" > nul
它將輸出foobar
到控制檯。爲什麼是這樣,我能做些什麼來解決它?
編輯:Here是$PSVersionTable
的輸出。看起來我正在使用PowerShell v5.0。
如果你打開一個命令提示符,然後輸入:批處理腳本:爲什麼重定向標準輸出不能在這種情況下工作?
echo foobar > nul
它將打印什麼,因爲nul
燕子所有輸入的。但是,如果你使用PowerShell運行命令:
powershell "echo foobar" > nul
它將輸出foobar
到控制檯。爲什麼是這樣,我能做些什麼來解決它?
編輯:Here是$PSVersionTable
的輸出。看起來我正在使用PowerShell v5.0。
注意:我假設您從cmd.exe調用您的命令,而不是從PowerShell內部調用,這與我看到的症狀一致。
依我看你在PS在一個錯誤跌跌撞撞(PowerShell中)V5(沒有出現在V3;有關問題的評論表明,它也並不在V4),雖然我不完全理解爲什麼PS是責怪,因爲我期望cmd.exe
來處理重定向。
但是,我可能會錯過一些東西,所以請讓我知道。默認情況下,輸出的東西,包括echo
,這是Write-Output
一個別名 - -
PowerShell的應該發送其所謂的成功流給外界的標準輸出。
在舊的PS版本>NUL
確實有效地抑制了PowerShell的輸出。
奇怪的是,v5中的錯誤隻影響NUL
,而重定向到實際文件工作。
至於變通方法:
如果你的代碼是V2兼容,試試這個:
powershell -version 2 "echo foobar" > NUL
否則,重定向到一個實際文件,然後刪除該文件:
powershell "echo foobar" > "%TEMP%\NUL-bug-workaround" & del "%TEMP%\NUL-bug-workaround"
謝謝!傳入'-Version 2'似乎解決了這個問題。在我敲了兩個小時之後,您剛剛釋放了我:D –
PowerShell不使用* stdout *,而是使用['WriteConsole'](https://msdn.microsoft.com/library/windows/desktop/ms687401 。aspx),當寫入控制檯。所以,如果它被重定向,它需要特殊的邏輯來寫入* stdout *。但是,由於某種原因,PowerShell似乎並沒有使用'[Console] :: IsOutputRedirected',而是使用自己的邏輯,對於'nul'情況有缺陷。 – PetSerAl
感謝@PetSerAl指出內部。期望PS尊重調用程序的重定向是合理的,不管PS的內部情況如何,以前的PowerShell版本都這樣做。聽起來你認爲這是一個錯誤,對吧?或者我缺少一些有意的行爲改變? – mklement0
在3.0版本的命令提示符下工作正常。 –
您使用的是哪個版本的Powershell?我從cmd提示符運行了您的示例並正確運行。我沒有得到任何輸出。我正在使用4.0版本。 – rrirower
@rrirower根據'$ PSVersionTable.PSVersion',它看起來像我使用5.0。 –