使用所有参数从批处理文件调用PowerShell脚本

时间:2017-09-11 20:35:54

标签: windows powershell batch-file

This questionthis blog post解决了如何将特定参数从批处理文件传递到PowerShell脚本。

如何将所有参数传递到PowerShell脚本?基本上我想要展开所有参数,以便批处理文件透明地传递所有参数。

修改以获取更多背景信息:

我目前正在使用如下行:

PowerShell.exe -Command "& '%~dpn0.ps1' '%1' '%2'"

这样可行,但会在文件之间创建冗余,这样,如果我更新PowerShell脚本以获取不同的参数,我也必须更新批处理脚本。如果我可以做类似的事情,那会更好:

PowerShell.exe -Command "& '%~dpn0.ps1' '%*'"

1 个答案:

答案 0 :(得分:6)

尝试以下方法:

powershell -File "%~dpn0.ps1" %*
  • 在批处理文件中,%*表示传递的所有参数。 [1]

  • -File是用于通过PowerShell CLI调用脚本的参数。

  • 然后所有剩余的参数都作为 as-is 传递(而-Command将使他们受到PowerShell [2] 的另一轮解释 )。

[1]请注意,对于cmd.exe(批处理文件)来识别嵌入空格作为单个参数的参数,必须将其括在"..."中。
例如,如果您想将参数ab c传递给批处理文件file.cmd,则必须将其称为
file a "b c"
要传递嵌入式 "个实例,\ - 逃避它们;例如,"\"b c\""使PowerShell看到"b c",包括双引号 如果您遵守这些规则,%* - 不引用 - 正确传递参数数组。
使用"%*" - 它将无法按预期工作。

[2]实际上,-Command会导致所有后续参数都被一个空格连接,然后结果字符串被解释为作为PowerShell命令 - 也就是说,在cmd.exe(批处理文件)的规则解析参数之后,它们受到PowerShell的另一轮解析。
不幸的是,PowerShell一直以这种方式工作,但是这种行为很模糊,并且可能会导致Unix世界更加混乱,现在PowerShell已经跨平台了 - 请参阅this GitHub issue