Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell:将外部命令输出传输到另一个外部命令_Powershell_Command_Pipe_External - Fatal编程技术网

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

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

干杯

通过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,这似乎是不可能的