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

jtp*_*yda 4 windows powershell batch-file

此问题此博客文章介绍了如何将特定参数从批处理文件传递到PowerShell脚本.

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

编辑更多上下文:

我目前正在使用如下行:

PowerShell.exe -Command "& '%~dpn0.ps1' '%1' '%2'"
Run Code Online (Sandbox Code Playgroud)

这可以,但在文件之间创建冗余,这样,如果我更新PowerShell脚本以采用不同的参数,我也必须更新批处理脚本.如果我可以做以下事情,那将是多么美好的事情:

PowerShell.exe -Command "& '%~dpn0.ps1' '%*'"
Run Code Online (Sandbox Code Playgroud)

mkl*_*nt0 6

请尝试以下方法:

powershell -File "%~dpn0.ps1" %*
Run Code Online (Sandbox Code Playgroud)
  • 在批处理文件中,%*表示传递的所有参数.[1]

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

  • 然后所有剩余的参数都按原样传递(而-CommandPowerShell将对它们进行另一轮解释[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已经跨平台了 - 请参阅此GitHub问题.

  • @TheIncorrigible1:无法通过_calling_ shell的规则正确传递参数,即`cmd.exe`.执行此操作后,该命令将按预期工作. (2认同)