PowerShell脚本启动外部命令:同步/异步执行及多命令顺序问询
嘿,这两个问题其实都是围绕PowerShell调用外部程序的执行逻辑来的,我给你讲得明明白白:
PowerShell外部命令执行模式解析
问题1:PowerShell脚本启动的外部命令是同步执行还是后台异步执行?
默认情况下,直接用&(调用操作符)或者直接敲外部命令名时,都是同步执行的——PowerShell会暂停脚本的后续执行,直到这个外部程序完全跑完退出,才会继续往下走。它不会默认把外部程序丢去后台当异步进程跑。
只有当你特意用异步方式启动(比如用Start-Process不带-Wait参数,或者用后台作业Start-Job这类方法),才会让外部命令在后台异步运行,不阻塞脚本。
问题2:启动第一个外部程序后,是否会等它退出再运行下一条命令?
必须会!就拿你提供的示例代码来说:
# Assume pagent loaded our key... & { & pscp -sftp "<some-path>\text*.json" nonroot@somehost:/home/nonroot/json ; Write-Output $LASTEXITCODE; & plink nonroot@somehost "/bin/processJSON.sh /home/nonroot/json"; Write-Output $LASTEXITCODE; }
这段代码的执行顺序是严格按顺序同步来的:
- 先跑
pscp传输文件,必须等pscp完成传输并退出,才会执行下一行的Write-Output; - 输出完pscp的退出码后,才会启动
plink连接远程主机执行脚本,同样要等plink执行完远程脚本并退出,才会输出它的退出码。
要是你想让某个外部命令在后台跑,不阻塞脚本后续执行,可以用Start-Process,比如:
# 异步启动pscp,不等它完成就继续执行后续命令 Start-Process pscp -ArgumentList "-sftp","<some-path>\text*.json","nonroot@somehost:/home/nonroot/json" -NoNewWindow
不过要注意,这种异步方式没法直接通过$LASTEXITCODE拿到退出码,得额外做处理(比如通过Start-Process的-PassThru参数获取进程对象,再用WaitForExit()和ExitCode属性)。
内容的提问来源于stack exchange,提问作者leeand00
相关产品推荐
相关产品推荐

