Powershell:将外部命令输出传输到另一个外部命令
我如何让PowerShell了解这类内容:Powershell:将外部命令输出传输到另一个外部命令,powershell,command,pipe,external,Powershell,Command,Pipe,External,我如何让PowerShell了解这类内容: Robocopy.exe | Find.exe "Started" 旧的命令处理器给出了一个结果,但我不知道如何在PowerShell中执行此操作: &robocopy | find.exe "Started" #error &robocopy | find.exe @("Started") #error &robocopy @("|", "find.exe","Start
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
干杯通过cmd调用它:
PS> cmd /c 'Robocopy.exe | Find.exe "Started"'
@Jobbo:cmd和PowerShell是两个不同的shell。混合它们有时是可能的,但正如你从谢伊的回答中意识到的那样,这不会让你走得太远。然而,你可能在这里问错了问题 大多数情况下,您试图解决的问题(如管道查找.exe)甚至都不是必需的。 在Powershell中,您确实有相当于find.exe的版本,实际上是更强大的版本:select string 始终可以运行命令并将结果分配给变量
$results = Robocopy c:\temp\a1 c:\temp\a2 /MIR
结果将是字符串类型,并且您有许多工具来对其进行切片和骰子分割
PS > $results |select-string "started"
Started : Monday, October 07, 2013 8:15:50 PM
tl;博士
注意嵌套引用。警告:将来可能会破裂。
robocopy.exe | find.exe“已启动”
可供替代的警告:在-%之后不支持*变量引用*
robocopy.exe | find.exe-%已启动
*如果可用*,请使用与PowerShell相当的外部程序。
您可以使用内置别名为scs的Select字符串代替“findstr.exe”:
注:输出为描述匹配线的*对象*。
要仅获取管线,请将管道连接到|%ToString
或-在PowerShell 7+中使用-原始
robocopy.exe | sls已启动
有关解释,请继续阅读
PowerShell支持与外部程序之间的管道连接
这里的问题是参数解析和传递:find.exe有一个奇怪的要求,它的搜索项必须用双引号括起来
在cmd.exe中,简单的双引号就足够了:find.exe已启动
相比之下,PowerShell默认情况下会在传递参数之前对其进行预分析,如果逐字参数值不包含空格,则会去掉引号,这样find.exe只能看到已启动的参数,而不会看到双引号,从而导致错误
有三种方法可以解决这个问题:
PS v3+仅当参数仅为文本和/或环境变量时才是一个选项:-%,通知PowerShell按原样将命令行的其余部分传递给目标程序引用环境变量(如果有),cmd style%%:
robocopy.exe | find.exe-%已启动
详细说明-%的限制。
PS v2,或者如果需要在参数中使用PowerShell变量:应用PowerShell的外层引用PowerShell将去掉单引号并按原样将字符串内容传递给find.exe,同时保留完整的双引号:
robocopy.exe | find.exe“已启动”
警告:这项技术只有在行为不正常的情况下才有效。如果此行为得到修复,则修复可能需要选择加入,上述操作将不再有效,因为PowerShell将在幕后传递Started,这将中断调用-有关更多信息,请参阅。
如果类似的PowerShell命令可用,请使用它,这样可以避免所有引用问题。在本例中,可以使用cmdlet,即PowerShell与findstr.exe更类似的PowerShell,如上所示
如果.exe不是为接受管道而设计的,则无法..Find.exe是为接受管道而设计的,lame.exe也是。我得到的任何错误都来自Powershell,我不明白我的意思。。您可以尝试cmd.exe中的Find示例,但如果我的命令向它们传递了许多参数,那么我是否会失去在数组中传递参数的好处,如@、、、,,,?有没有不涉及cmd.exe的方法可以做到这一点?这是可行的,但读起来却是一场噩梦:&cmd@/c、@'robocy'、“|'、'find start'是否真的是将所有内容构建为一个字符串和嵌套数组之间的权衡?我知道这种感觉。。。我会在cmd文件中编写比一行长的命令,然后执行。哇,这真是太差劲了。我想知道我能不能利用管道把主机接出去?我发现我可以使用Tee对象将robocy的输出转换成一个变量,但接下来的问题是将一个变量转换成一个外部命令,比如:$out |&find.exe,这似乎是不可能的