在ForEach循环中运行程序

30

我试图让这个简单的PowerShell脚本正常工作,但我认为有些地方基本上有问题。 ;-)

ls | ForEach { "C:\Working\tools\custom-tool.exe" $_ }

我基本上想获取目录中的文件,并将它们逐个作为参数传递给自定义工具。

4个回答

46
如果路径中仍需要引号(比如有空格),可以像这样处理:
ls | % { &"C:\Working\tools\custom-tool.exe" $_.FullName }

注意在字符串前使用 &,以强制 PowerShell 将其解释为命令而不是字符串。

->

注意在字符串前使用 &,以强制 PowerShell 将其解释为命令而不是字符串。


如果需要标志,它们可以在结尾后添加;ls | % { &"C:\Working\tools\custom-tool.exe" $_.FullName --flag --flag2=47} - Nick T
我发现了。它是 ForEach-Object 的别名。你可以在 PowerShell 提示符下键入 get-alias 来查看当前的别名。 - User

37
ls | %{C:\Working\tools\custom-tool.exe $_}

每当一个对象经过管道时,该工具将对其运行。在命令字符串周围加上引号会导致它成为一个字符串!本地变量"$_"可能无法处理,因此会出错。


6

我猜测你的工具需要完整路径。 $_ 是通过管道传递的每个文件对象。 你可能需要使用这样的表达式:

ls | %{C:\Working\tools\custom-tool.exe $_.fullname}

3

Jeffrery Hicks和slipsec都是正确的。去掉双引号。

在我的测试脚本(如下)中,$_或$_.fullname有效。对于您的自定义工具可能会有所不同。

gci | % { c:\windows\notepad.exe $_.fullname }

或者

gci | % { c:\windows\notepad.exe $_ }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接