如何编写PS1脚本以在管理员权限的Windows Terminal中执行多条PowerShell命令
如何编写PS1脚本以在管理员权限的Windows Terminal中执行多条PowerShell命令
让我来帮你解决这个问题,你之前遇到的错误主要是因为Windows Terminal(wt.exe)的参数格式和直接调用pwsh.exe不一样,而且命令串的引号转义处理得不对。我给你两种可靠的写法,都能实现需求:
方法一:数组传递参数(推荐,避免引号混乱)
这种方式把每个参数拆成单独的数组元素,Start-Process会自动处理参数的传递,不用手动折腾引号转义:
# test.ps1 # 定义要执行的多条命令,注意如果想让$Home在新的管理员进程中解析,要加反引号转义 $targetCommands = "Pushd `$Home; bcdedit /enum bootmgr; pause" # 构造wt.exe的参数数组 $wtArguments = @( "-M", # 最大化窗口 "-p", "PowerShell", # 指定启动PowerShell配置文件的标签页 "pwsh.exe", "-ExecutionPolicy", "Bypass", "-Command", $targetCommands ) # 以管理员身份启动Windows Terminal Start-Process -Verb RunAs -FilePath wt.exe -ArgumentList $wtArguments
方法二:单字符串参数(需要注意引号转义)
如果你习惯用单字符串传递参数,要确保内部的引号正确转义,避免Windows Terminal解析出错:
# test.ps1 # 转义命令中的双引号,同时转义$Home让它在新进程中生效 $targetCommands = "Pushd `$Home; bcdedit /enum bootmgr; pause" # 构造完整的参数字符串,注意包裹命令的双引号要加反引号转义 $wtArguments = "-M -p PowerShell pwsh.exe -ExecutionPolicy Bypass -Command `"$targetCommands`"" Start-Process -Verb RunAs -FilePath wt.exe -ArgumentList $wtArguments
为什么之前的写法会报错?
你之前的脚本把参数拆成了数组,但wt.exe对参数的解析逻辑和pwsh.exe不同,拆分后的数组元素会被错误解析成独立的命令片段,导致找不到对应程序的错误(0x80070002就是文件/路径不存在的错误)。另外,命令串的引号转义不彻底,也让终端无法正确识别完整的命令。
执行上面的脚本后,会弹出UAC权限请求,同意后Windows Terminal就会以管理员身份打开,自动执行你指定的三条命令啦。
备注:内容来源于stack exchange,提问作者Mr.Key7
相关产品推荐
相关产品推荐

