如何在脚本中复用已启动的独立PowerShell/cmd窗口执行命令
实现方案
方案1:PowerShell 原生进程交互(推荐)
这是Windows平台最稳妥的实现方式,全程不需要第三方工具:
- 第一步:启动sip-client子进程,重定向标准输入流,后台驻留
# 初始化进程启动参数 $processStartInfo = [System.Diagnostics.ProcessStartInfo]::new() $processStartInfo.FileName = "sip-client.exe" # 替换为你的sip-client实际路径 $processStartInfo.Arguments = "这里填你注册sip中继的启动参数" $processStartInfo.RedirectStandardInput = $true $processStartInfo.UseShellExecute = $false $processStartInfo.CreateNoWindow = $true # 不需要显示窗口的话可以开启 # 启动进程并保存实例 $global:sipClientProcess = [System.Diagnostics.Process]::Start($processStartInfo)
- 第二步:后续需要拨打电话时,直接往进程的标准输入流写指令即可
# 假设sip-client的拨打电话指令是 dial 138XXXXXXX $global:sipClientProcess.StandardInput.WriteLine("dial 138XXXXXXX") # 指令发送后不需要重启进程,进程会继续保持监听模式
- 退出时清理进程的操作
if (!$sipClientProcess.HasExited) { $sipClientProcess.StandardInput.WriteLine("quit") # 替换为sip-client的退出指令 $sipClientProcess.WaitForExit(3000) $sipClientProcess.Close() }
方案2:CMD 环境下的替代方案
如果必须用CMD脚本实现,可以用命名管道做进程间通信:
- 第一步:先创建命名管道,启动sip-client后台监听
:: 创建命名管道,后台启动sip-client绑定管道输入 start /B sip-client.exe < \\.\pipe\sip_client_pipe
- 第二步:需要发送指令时,往命名管道写入内容即可
:: 发送拨号指令 echo dial 138XXXXXXX > \\.\pipe\sip_client_pipe
注意事项
- 确保你用的sip-client支持标准输入交互模式,部分CLI工具只支持启动参数传参不支持运行中输入指令,这种情况需要先确认工具的交互逻辑
- 如果sip-client有输出日志需要读取,可以同步重定向StandardOutput和StandardError流做日志记录
内容的提问来源于stack exchange,提问作者ilRobby
相关产品推荐
相关产品推荐

