此PS1 File
( )在执行时将以管理员身份test.ps1
运行命令。Pushd $Home; bcdedit /enum bootmgr; pause
PWSH.exe
# test.ps1
$AL = "-NoProfile -WindowStyle Maximized -ExecutionPolicy Bypass",
"-Command", "Pushd $Home; bcdedit /enum bootmgr; pause"
Start -Verb RunAs -FilePath pwsh.exe -ArgumentList $AL
写入格式是什么,如果我执行它(test.ps1
),那么将在 Windows 终端提升/以管理员身份打开?
我试过:
# test.ps1
$AL = "-M -p 'PowerShell'",
"pwsh.exe -ExecutionPolicy Bypass -Command `"Pushd $Home; bcdedit /enum bootmgr; pause`""
Start -Verb RunAs -FilePath wt.exe -ArgumentList $AL
给出错误:
[error 2147942402 (0x80070002) when launching `" pause"']
[error 2147942402 (0x80070002) when launching `" bcdedit /enum bootmgr"']
我也尝试了其他格式,但错误仍然存在。
仅当使用一个命令时才有效:
# test.ps1
$AL = "-M -p 'PowerShell'",
"pwsh.exe -ExecutionPolicy Bypass -Command `"bcdedit /enum bootmgr`""
Start -Verb RunAs -FilePath wt.exe -ArgumentList $AL
答案1
未转义 ;
在wt.exe
命令行用于分隔多个命令对于 Windows 终端。
所以,;
角色传递给目标可执行文件 必须是逃脱,即作为\;
,不幸的是总是必要的——即使对于;
内部(嵌入)的字符也是如此"..."
。
- 截至撰写本文时,链接的文档并未说明此要求;GitHub 文档问题 #763旨在纠正这一问题。
所以:
$AL = "-M -p PowerShell -d `"$HOME`" " +
'pwsh.exe -ExecutionPolicy Bypass -c "bcdedit /enum bootmgr\; pause"'
Start-Process -Verb RunAs -FilePath wt.exe -ArgumentList $AL
笔记:
- 为了简单起见,上面使用
wt.exe
的-d
选项来传递启动目录。 - A单身的字符串编码全部参数被传递给
-ArgumentList
参数,这通常可以解决长期存在的无法修复的错误 - 请参阅这个答案。