PowerShell脚本发送命令后如何退出Plink以解决脚本挂起问题?
解决Plink串口会话挂起的问题
问题根源是Plink在串口模式下会持续保持连接等待输入,即使发送完触发命令,它也不会自动退出,导致PowerShell脚本卡住。以下几种方法可解决:
方法1:用Start-Process控制Plink进程(推荐)
通过PowerShell的Start-Process启动Plink,手动管理输入输出流,并设置超时或强制终止进程,彻底避免挂起:
# 配置参数 $plinkPath = "C:\实际路径\plink.exe" $triggerCmd = "你的传感器触发指令" $outputFile = "sensor_data.txt" $comPort = "COM4" $serialConfig = "38400,8,n,1,N" # 启动Plink进程,重定向输入输出 $plinkProcess = Start-Process -FilePath $plinkPath ` -ArgumentList "-batch -serial $comPort -sercfg $serialConfig" ` -RedirectStandardInput $true ` -RedirectStandardOutput $true ` -NoNewWindow ` -PassThru # 发送触发命令,关闭输入流(告知Plink无更多输入) $plinkProcess.StandardInput.WriteLine($triggerCmd) $plinkProcess.StandardInput.Close() # 等待进程退出(设置超时,单位毫秒,根据传感器响应速度调整) $timeoutMs = 3000 if ($plinkProcess.WaitForExit($timeoutMs)) { # 读取传感器响应并追加到文件 $sensorData = $plinkProcess.StandardOutput.ReadToEnd() Add-Content -Path $outputFile -Value $sensorData } else { # 超时则强制终止进程 $plinkProcess.Kill() Write-Warning "Plink未及时响应,已强制终止" }
把这段代码放到循环里,就能重复触发传感器并保存数据。
方法2:通过管道关闭输入流
在原有管道逻辑基础上,确保输入流发送完毕后关闭,让Plink感知到输入结束:
# 循环执行示例(重复5次) for ($i=1; $i -le 5; $i++) { # 发送命令并关闭输入流 ($P | Out-String -Stream) | & $plinkpath -batch -serial COM4 -sercfg 38400,8,n,1,N | Out-File -FilePath $outputfile -Append }
注:部分场景下这种方法可能仍会挂起(Plink串口模式未必因输入流关闭而退出),此时优先使用方法1。
方法3:强制终止Plink进程
如果上述方法无效,可在发送命令后延迟一段时间,强制杀掉Plink进程(需确保传感器已完成输出):
# 启动Plink并后台运行 Start-Job -ScriptBlock { param($plinkPath, $cmd, $outFile, $com, $cfg) $cmd | & $plinkPath -batch -serial $com -sercfg $cfg | Out-File -FilePath $outFile -Append } -ArgumentList $plinkpath, $P, $outputfile, "COM4", "38400,8,n,1,N" # 等待传感器完成输出(调整延迟时间) Start-Sleep -Seconds 2 # 强制终止所有Plink进程 Get-Process plink -ErrorAction SilentlyContinue | Stop-Process -Force
内容的提问来源于stack exchange,提问作者yjaco
相关产品推荐
相关产品推荐

