在Windows批处理文件中的多行分割字符串

时间:2020-09-18 08:50:51

标签: windows powershell batch-file cmd

我想调用提升的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');

1 个答案:

答案 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 ^
\"}"

我已经将ExecutionPolicyBypass(我永远不建议使用,甚至在高架运行时不建议使用))更改为RemoteSigned ,请不要将其改回。另外,为了提高安全性,我引用了您的.ps1文件路径,该路径可以包含空格。反斜杠转义cmd.exe解析器(如前所述)的双引号,然后反引号转义powershell.exe解析器的其余嵌套双引号。