2016-02-21 46 views
4

如果你打開一個命令提示符,然後輸入:批處理腳本:爲什麼重定向標準輸出不能在這種情況下工作?

echo foobar > nul 

它將打印什麼,因爲nul燕子所有輸入的。但是,如果你使用PowerShell運行命令:

powershell "echo foobar" > nul 

它將輸出foobar到控制檯。爲什麼是這樣,我能做些什麼來解決它?

編輯:Here$PSVersionTable的輸出。看起來我正在使用PowerShell v5.0。

+0

在3.0版本的命令提示符下工作正常。 –

+0

您使用的是哪個版本的Powershell?我從cmd提示符運行了您的示例並正確運行。我沒有得到任何輸出。我正在使用4.0版本。 – rrirower

+0

@rrirower根據'$ PSVersionTable.PSVersion',它看起來像我使用5.0。 –

回答

5

注意:我假設您從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" 
+1

謝謝!傳入'-Version 2'似乎解決了這個問題。在我敲了兩個小時之後,您剛剛釋放了我:D –

+2

PowerShell不使用* stdout *,而是使用['WriteConsole'](https://msdn.microsoft.com/library/windows/desktop/ms687401 。aspx),當寫入控制檯。所以,如果它被重定向,它需要特殊的邏輯來寫入* stdout *。但是,由於某種原因,PowerShell似乎並沒有使用'[Console] :: IsOutputRedirected',而是使用自己的邏輯,對於'nul'情況有缺陷。 – PetSerAl

+1

感謝@PetSerAl指出內部。期望PS尊重調用程序的重定向是合理的,不管PS的內部情況如何,以前的PowerShell版本都這樣做。聽起來你認爲這是一個錯誤,對吧?或者我缺少一些有意的行爲改變? – mklement0

相關問題