如何以其他用户身份执行代码并解决输出空白、PowerShell窗口闪退问题
问题根源
- 变量作用域不互通:你在当前PowerShell会话中定义的
$Setloc无法传递到Start-Process拉起的独立子进程中,且Set-Location执行后默认无返回值,该变量本身为空,完全没有实际作用 - 输出捕获逻辑错误:
Start-Process默认不会将子进程的标准输出传递到当前会话的管道,你直接在后面拼接Out-File只会写入空内容 - 参数规则不符合要求:
powershell.exe的/C参数代表执行完指定命令后立即退出,即便你添加了-NoExit,如果参数顺序错误也不会生效
修正后代码
# 提前定义PGP目录和输出文件路径 $pgpInstallPath = "C:\Program Files (x86)\PGP Corporation\PGP Desktop" $resultOutputPath = "C:\users\USERNAME\Desktop\test.txt" $username = 'DOMAIN\Username' $Password = 'PASSWORD' | ConvertTo-SecureString -Force -AsPlainText $credential = New-Object System.Management.Automation.PsCredential($username, $Password) # 整合子进程要执行的完整命令逻辑:切换工作目录→执行pgpwde命令 $runCommand = "Set-Location '$pgpInstallPath'; .\pgpwde --status --disk 0" # 启动进程时直接重定向标准输出到目标文件 Start-Process powershell.exe -Credential $credential -ArgumentList "/C", $runCommand -RedirectStandardOutput $resultOutputPath -Wait
调整说明
- 把切换工作目录、执行目标命令的逻辑全部整合到传给子进程的命令串中,规避了跨进程变量无法传递的问题
- 用
Start-Process自带的-RedirectStandardOutput参数直接把子进程的标准输出写入指定文件,代替原本无效的管道输出逻辑 - 新增
-Wait参数让当前会话等待子进程执行完成后再继续后续操作,避免出现文件还没写入就被读取的问题 - 如果你需要保留执行后的PowerShell窗口不消失,把参数里的
/C替换为/K即可
内容的提问来源于stack exchange,提问作者My9to5
相关产品推荐
相关产品推荐

