Powershell:将外部命令输出管道输出到另一个外部命令

时间:2013-10-07 09:15:43

标签: powershell command pipe external

如何让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。

干杯

3 个答案:

答案 0 :(得分:1)

通过cmd:

调用它
PS> cmd /c 'Robocopy.exe | Find.exe "Started"'

答案 1 :(得分:1)

@Jobbo:​​cmd和PowerShell是两个不同的shell。混合它们有时是可能的,但正如你从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

答案 2 :(得分:1)

<强> TL;博士

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

有关嵌套引文的解释,请继续阅读。

PowerShell 支持支持与外部程序的管道。

这里的问题是参数解析和传递之一: find.exe 有一个奇怪的要求,即搜索词必须包含在 literal double中引号。

cmd.exe中,简单的双引号就足够了:find.exe "Started"

相比之下, PowerShell默认情况下在传递参数之前预分析参数,剥离封闭引号,以便find.exe仅查看Started没有双引号,导致错误。

有两种方法可以解决这个问题:

  • PS v3 + (如果您的参数仅为文字和/或环境变量,则只有一个选项):特殊参数--% 告诉PowerShell 将命令行 rest 原样传递给目标程序(参考环境变量,如果有的话,cmd-style(%<var>%)):
    robocopy.exe | find.exe --% "Started"

  • PS v2 - ,或者如果您需要在参数中使用PowerShell 变量:应用 PowerShell引用的外层 (PowerShell将删除单引号并将字符串的内容原样传递给find.exe,并用双引号括起来完成):
    robocopy.exe | find.exe '"Started"'