我想调用提升的Powershell来执行脚本并传递一堆参数。我想让.bat文件中的每个参数都单独显示。通常,我可以使用carat ^将命令跨越.bat文件中的几行,就像在Powershell脚本中使用重音符号`一样。但两者在这种情况下都不起作用:
单线工作:
Powershell.exe -Command "& {Start-Process Powershell.exe -Verb RunAs -ArgumentList '-ExecutionPolicy Bypass -File %~dp0HelloWorld.ps1 -parameter1 Long -parameter2 list -parameter3 of -parameter4 parameters' }"
尝试使用插入符号^将其分成多行不起作用:
Powershell.exe -Command "& {Start-Process Powershell.exe -Verb RunAs -ArgumentList '-ExecutionPolicy Bypass -File %~dp0HelloWorld.ps1 ^
-parameter1 Long ^
-parameter2 list ^
-parameter3 of ^
-parameter4 parameters ^
'}"
这里有一个示例HelloWorld.ps1
进行测试(必须与批处理文件位于同一目录中):
param (
$parameter1="",
$parameter2="",
$parameter3="",
$parameter4=""
)
write-host "$parameter1 $parameter2 $parameter3 $parameter4"
Write-Host -NoNewLine 'Press any key to continue...';
$null = $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown');
答案 0 :(得分:3)
在上面的示例中,解决此问题的最简单方法是使用双引号"
而不是单引号'
。但是,为防止cmd.exe
无法解析命令,您需要使用反斜杠(即\"
)来转义那些嵌套的双引号。
示例:
@Powershell.exe -Command "& {Start-Process Powershell.exe -Verb RunAs -ArgumentList \" ^
-ExecutionPolicy RemoteSigned ^
-File `\"%~dp0HelloWorld.ps1`\" ^
-parameter1 Long ^
-parameter2 list ^
-parameter3 of ^
-parameter4 parameters ^
\"}"
我已经将ExecutionPolicy
从Bypass
((我永远不建议使用,甚至在高架运行时不建议使用))更改为RemoteSigned
,请不要将其改回。另外,为了提高安全性,我引用了您的.ps1
文件路径,该路径可以包含空格。反斜杠转义cmd.exe
解析器(如前所述)的双引号,然后反引号转义powershell.exe
解析器的其余嵌套双引号。