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

标签 windows powershell batch-file

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

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

编辑以获得更多上下文:

我目前正在使用这样的一行:

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

这可行,但会在文件之间产生冗余,因此,如果我更新 PowerShell 脚本以采用不同的参数,我也必须更新批处理脚本。如果我能做类似的事情就好了:

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

最佳答案

尝试以下操作:

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

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

  • 然后所有剩余的参数将按原样传递(而 -Command 将使它们接受 PowerShell 的另一轮解释[2] ).

[1] 请注意,要让 cmd.exe(批处理文件)将带有嵌入空格的参数识别为单个参数,您必须将其包含在 "... "
例如,如果您想将参数 ab c 传递给批处理文件 file.cmd,您必须将其命名为
文件 a "b c"
要传递嵌入 " 实例,\-转义它们;例如,"\"b c\"" 使 PowerShell参见 "b c",包括双引号。
如果您遵守这些规则,%* - 不加引号 - 会正确地传递参数数组。
不要使用"%*" - 它不会按预期工作。

[2] 实际上,-Command 导致所有后续参数均由一个空格连接,然后解释结果字符串 作为 PowerShell 命令 - 也就是说,在按照 cmd.exe(批处理文件)的规则解析参数之后,它们将受到另一轮通过 PowerShell 进行解析。
不幸的是,PowerShell 一直以这种方式工作,但行为是模糊的,而且很可能在 Unix 世界中引起更多的困惑,现在 PowerShell 已经跨平台 - 参见 this GitHub issue .

关于windows - 使用所有参数从批处理文件调用 PowerShell 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46163975/

相关文章:

C# process.Kill 不会立即停止正在运行批处理文件的进程

asp.net - 运行计划任务的最佳方式

PowerShell : Is it mandatory to save script module in same name as directory

c++ - 在 C++ 中读取另一个进程的标准输出

powershell - 如何通过powershell重命名azure订阅名称

function - PowerShell 传递函数中接收到的所有参数,并处理带空格的参数

windows - 调用批处理脚本而不使用 CALL 或 START

windows - 复制文件而不覆盖

c++ - 跨平台C++ : convert to/from UTC/local time WITH historical tzdata

java - 如何在 Java 中接收 Windows 文件系统事件?