2017-09-11 41 views
3

This questionthis blog post解决了如何将特定参数从批处理文件传递到PowerShell脚本中。从具有所有参数的批处理文件调用PowerShell脚本

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

编辑更多的背景:我目前使用的电话线像

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

这工作,但创建的文件之间的冗余,从而,如果我更新的PowerShell脚本要采取不同的论点,我也必须更新批处理脚本。什么是好的是,如果我可以这样做:

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

你能提供一个你想要的例子吗? 'Cmd'不像'PSv3' +那样具有溅射。 – TheIncorrigible1

+0

@ TheIncorrigible1我目前使用的命令如'PowerShell.exe -Command'&'%〜dpn0.ps1''%1''%2'“';我希望能够通过所有参数而不必枚举它们。 – jtpereyda

+0

我不确定这是否可行或如何,但是如果您执行了下面的操作,那么执行“PowerShell.exe -Command”&'%〜dpn0.ps1''%*'“' – jtpereyda

回答

5

尝试以下操作:

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

  • -File是参数使用通过PowerShell的CLI来调用脚本。然后

  • 所有其余的参数都穿过作为原样(而-Command将它们经受由PowerShell的另一轮解释的[2] )。

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

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

+0

这将错过传递给它们的参数。 '%*'将从字面上转储所有参数。 – TheIncorrigible1

+0

@ TheIncorrigible1:否:如果您正确地将它们传递给批处理文件,它们会完整地传递。 – mklement0

+0

假设你将它们传递给引号。在他的例子中,他是故意引用它们的,所以可以安全地假设它们没有被这样通过,或者他只是过于明确 – TheIncorrigible1

相关问题