如何让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 :(得分: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"'