gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 16:38:02 25 4
gpt4 key购买 nike

我怎样才能让 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。

干杯

最佳答案

tl;博士

# Note the nested quoting. CAVEAT: May break in the future.
robocopy.exe | find.exe '"Started"'

# Alternative. CAVEAT: doesn't support *variable references* after --%
robocopy.exe | find.exe --% "Started"

# *If available*, use PowerShell's equivalent of an external program.
# In lieu of `findstr.exe`, you can use Select-String (whose built-in alias is scs):
# Note: Outputs are *objects* describing the matching lines.
# To get just the lines, pipe to | % ToString
# or - in PowerShell 7+ _ use -Raw
robocopy.exe | sls Started
有关解释,请继续阅读。

PowerShell 确实支持传入和传出外部程序的管道。
这里的问题是参数解析和传递之一: find.exe 有一个奇怪的要求是它的 搜索词必须用文字双引号括起来。
cmd.exe ,简单的双引号就足够了: find.exe "Started"相比之下, 默认情况下,PowerShell 在传递参数之前预解析参数并去除引号 如果逐字参数值不包含空格,则 find.exe只能看到 Started , 没有双引号,导致错误。
有三种方法可以解决这个问题:
  • PS v3+ (如果您的参数只是文字和/或环境变量,则仅是一个选项):--% , stop-parsing symbol , 告诉 PowerShell 将命令行的其余部分按原样传递给目标程序 (引用环境变量,如果有的话,cmd 样式( %<var>% )):robocopy.exe | find.exe --% "Started"
  • This answer详细说明 --% 的限制.

  • PS v2 也可以,或 如果需要在参数中使用PowerShell变量: 申请 PowerShell 引用的外层 (PowerShell 将去除单引号并将字符串的内容按原样传递给 find.exe ,并完整地将双引号括起来):robocopy.exe | find.exe '"Started"'
  • 警告 :这种技术只是由于破坏行为才起作用。如果此行为得到修复(修复可能需要选择加入),上述操作将不再起作用,因为 PowerShell 将通过 ""Started""在幕后,中断通话 - 见 this answer想要查询更多的信息。

  • 如果有类似的 PowerShell 命令可用,请使用它,以避免所有引用问题。 在这种情况下, Select-String cmdlet,PowerShell 更类似于 findstr.exe 的 powershell可以使用,如上图。
  • 关于Powershell:管道外部命令输出到另一个外部命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19220933/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com