[英]Call Windows executable from PowerShell script, passing all arguments
我翻遍了,找不到答案。 如果这是重复的,请指出我的问题,但我看到的大多数事情都有答案,go 绕圈子,谈论各种复杂的事情,没有直接的答案。
我的问题很简单。 我有以下 Windows 批处理文件foo.bat
:
@ECHO OFF
bar.exe %*
如果我从命令行调用 foo.bat foobar foo.bat foobar 123
,它会调用bar.exe foobar 123
。 这适用于没有命令行 arguments 的情况。 这适用于多个命令行 arguments。
什么是等效的 PowerShell 脚本,它基本上做同样的事情:调用另一个可执行文件,传递用户提供的所有 CLI 参数?
我不认为这会很困难,但我肯定找不到任何直截了当的答案。
foo.bat 文件的foo.bat
等效文件是:
bar.exe @args
PowerShell 将所有(未绑定的)位置 arguments [1]公开为存储在自动$args
变量中的数组。
通过在$args
前面加上@
而不是$
,使用了参数飞溅,这意味着$args
数组的元素作为单独的 arguments 传递给bar.exe
bar.exe
)时,这不是绝对必要的 - $args
也可以在那里工作 - 但更通用,因为它还可以正确地将命名的 arguments 传递给其他PowerShell命令,这些命令通常已声明可以按名称绑定的参数(例如, -Path C:\temp
绑定值C:\temp
到声明的参数-Path
) 至于一般使用$args
:
$args.Count
告诉您通过了多少(未绑定)位置 arguments,$args[0]
返回第一个这样的参数, $args[1]
返回第二个,以此类推。 但是,通常最好在 PowerShell 脚本和函数中正式声明参数,然后它们也可以通过名称绑定(例如, -FooParam foo
而不是仅仅foo
)。 有关更多信息,请参阅此答案。
[1] 如果您的脚本没有正式声明任何参数(通过param(...)
块 - 请参阅about_Scripts和链接的答案),则所有arguments 根据定义都是未绑定的(即未映射到声明的参数)和位置(不以目标参数名称为前缀)。 但是,如果您的脚本确实声明了参数,则$args
仅包含那些 arguments(如果有的话),除了绑定到声明参数的那些之外,它们还被传递。 如果您的脚本是高级脚本(或函数) ,则根本不支持$args
,因为传递未绑定的 arguments 会被断然阻止。 有关更多信息,请参阅此答案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.