虽然将传递参数单独传递给Start-Process
cmdlet 的 -ArgumentList
参数在概念上可能更可取,但不幸的是,一个长期存在的错误使得将所有参数编码在单个字符串中更好- 请参阅此答案。
-Verb RunAs
用于启动具有提升的命令(以管理员身份),总是使用SYSTEM32 目录作为工作目录 - 即使是-WorkingDirectory
参数,如果存在,也会被悄悄地忽略。因此,为了设置自定义工作目录并调用 ,-Command
必须使用 CLI 参数,并且Set-Location
( cd
) 调用必须在调用相对路径指定的脚本之前。
cmd.exe
通过powershell.exe
Windows PowerShell CLI执行所有这些操作会使事情变得复杂,因为需要转义。
应用于您的powershell.exe
CLI 调用(假设 dir.C:\path 1
和 script file setup 1.ps1
):
powershell -Command "Start-Process -Verb RunAs powershell '-NoExit -ExecutionPolicy Bypass -Command "^"" cd \\"^""C:\path 1\\"^""; & \\"^"".\setup 1.ps1\\"^"" "^""'"
笔记:
From cmd.exe
, "^""
(sic) 是将"
嵌入在整个"..."
字符串中的内容传递到powershell.exe
(从无壳上下文,例如计划任务,使用"""
或更简单地说,\"
.
为简单起见,对于双重嵌套的"
字符。上面使用了\
-escaping 技术,带有\
字符。自己需要转义为\\
.
注意:从 PowerShell CLI 的角度来看 - 包括在 PowerShell (Core) 7+ 中(见下文) -\"
总是有效,但它的使用是有问题的cmd.exe
,它不能理解\"
为转义 "
字符。因此将其视为常规字符串定界符,这可能会导致它误解\"...\"
作为未引用字符串的一部分的内容,其中元字符(例如)&
可能会破坏命令,因为它们是由cmd.exe
自身预先解释的;例如,powershell -c " \"Abbot & Costello\" "
break from cmd.exe
,需要^&
代替,"
或者,如上所示,转义嵌入"
为"^""
:
powershell -c " "^""Abbot & Costello"^"" "
当您pwsh.exe
改为调用 PowerShell (Core) 7+ CLI时,可以进行两种简化:
pwsh.exe -Command "Start-Process -Verb RunAs pwsh.exe '-NoExit -ExecutionPolicy Bypass -WorkingDirectory ""C:\path 1"" -File ""C:\path 1\setup 1.ps1""'"