2013-10-07 119 views
3

我怎樣才能獲得PowerShell來理解這種類型的事情:PowerShell的:管道外部命令輸出到另一個外部命令

Robocopy.exe | Find.exe "Started" 

舊命令處理器給了一個結果,但我感到困惑的是如何做到這一點在PowerShell中:

&robocopy | find.exe "Started"    #error 
&robocopy | find.exe @("Started")    #error 
&robocopy @("|", "find.exe","Started")  #error 
&robocopy | &find @("Started")    #error 
&(robocopy | find "Started")     #error 

本質上,我想將一個外部命令的輸出管道化爲另一個外部命令。實際上,我將調用flac.exe並將其導入lame.exe以將FLAC轉換爲MP3。

乾杯

+0

如果.exe沒有被設計爲接受管道,你不能.. –

+0

Find.exe被設計爲接受管道,和lame.exe一樣。我得到的任何錯誤都是從Powershell不理解我的意思..你可以嘗試cmd.exe中的查找示例 – Jobbo

回答

1

TL;博士

robocopy.exe | find.exe '"Started"' # Note the nested quoting. 

對於嵌套引用的說明,閱讀。


PowerShell的確實支持的管道和從外部程序。

這裏的問題是參數解析和傳球的一個:find.exe有其檢索詞都必須包含在字面雙引號好奇的要求。

cmd.exe,簡約的雙引號就足夠了:find.exe "Started"

相比之下,PowerShell的默認預解析它們傳遞前的參數和封閉報價,使find.exe只看到Started沒有雙引號,導致錯誤。

有兩種方法來解決這個問題:

  • PS V3 +(僅當您的參數僅文字和/或環境變量一個選項):特殊參數--%告訴PowerShell以的其餘部分通過命令行原樣傳遞給目標程序(參考環境變量,如果有的話,CMD式(%<var>%)):
    robocopy.exe | find.exe --% "Started"

  • PS V2-,或者如果你需要使用PowerShell 變量中的參數:適用的外層的PowerShell的引用(PowerShell的將去掉單引號和傳遞字符串的內容作爲-是find.exe,與包圍雙引號完整):
    robocopy.exe | find.exe '"Started"'

1

通過CMD調用它:

PS> cmd /c 'Robocopy.exe | Find.exe "Started"' 
+0

這可行,但如果我的命令有很多參數傳遞給他們(他們這樣做),那麼我會失去好處在數組中傳遞參數,如@(,,,)?有沒有辦法做到這一點,而不涉及cmd.exe? – Jobbo

+0

這個工程,但是是一個惡夢閱讀: &cmd @(「/ c」,@('robocopy','|','find「開始'')) 它是真正的建立它之間的權衡所有作爲一個字符串和嵌套數組? – Jobbo

+0

我知道這種感覺......我會在cmd文件中編寫超過一行的命令並執行它。 –

1

@Jobbo:​​cmd並PowerShell的是兩種不同的炮彈。混合它們有時是可能的,但是從Shay的回答中可以看出,它不會讓你變得太過分。但是,您可能會在此提出錯誤的問題。

大多數情況下,您試圖解決的問題,如管道find.exe甚至沒有必要。 在Powershell中,您確實具有與find.exe相同的功能,實際上功能更強大:select-string

您可以始終運行命令並將結果分配給變量。

$results = Robocopy c:\temp\a1 c:\temp\a2 /MIR 

結果將是STRING類型,並且您有許多工具可以對其進行切片和切塊。

PS > $results |select-string "started" 

    Started : Monday, October 07, 2013 8:15:50 PM