繁体   English   中英

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

[英]Call PowerShell Script From Batch File With All Parameters

这个问题这篇博文解决了如何将特定参数从批处理文件传递到 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 (批处理文件)来识别嵌入空格作为单个参数的参数,必须将其括在"..."
例如,如果要将参数abc传递给批处理文件file.cmd ,则必须将其称为
file a "bc"
要传递嵌入的 "实例, \\ -escape它们;例如, "\\"bc\\""使PowerShell看到"bc" ,包括双引号。
如果您遵守这些规则, %* - 不引用 - 正确传递参数数组。
不要使用"%*" -如预期它不会工作。

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

我想做类似的事情,但最近有点复杂,这里的答案和一些网站上的信息对我帮助很大。 在我的情况下,要从 cmd 传递的参数是可变数量的路径,通常带有空格,可能带有 $ 和 & - 并且参数将被打乱,即它必须在字符串之间有逗号,否则脚本会解释它作为一个不同的论点。 不管我做什么,我都会破坏一些东西。 因此,最后我将所有单独的条目连接到一个变量中,为 $ 和 & 引入转义符,并将其传递给中间脚本:

set a="%~1"
if [%1]==[] goto end
:loop
shift
set bbbb="%~1"
if [%1]==[] goto execute
set a=%a% %b%
goto loop
:execute
set aaaa=%aaaa:&=`&%
set aaaa=%aaaa:$=`$%
powershell -file (fullpath)\intermediatescript.ps1 %a%
:end
exit

它只包含一行,调用主脚本:

& '(fullpath)\mainscript.ps1' -Path:$args

(如果有人正在寻找与我类似的问题的解决方案,或者更聪明的人发现我的方法存在迄今为止我未能遇到的问题,我会分享这个。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM