如何用PowerShell批量检测多台机器上PROGRAM.EXE的运行状态
问题
作为编程和PowerShell脚本新手,需要批量检测50多台机器上PROGRAM.EXE的运行状态。同事提供的单台检测命令为:
tasklist /s COMPUTER1 /svc /fi "IMAGENAME eq PROGRAM.EXE"
尝试用ForEach循环批量执行时,无法从返回结果直接判断程序是否运行,希望能针对每台机器输出明确的YES/NO状态。
原测试代码:
$postes = @('COMPUTER1', 'COMPUTER2', 'COMPUTER3') Foreach($element in $postes) { $( tasklist /s $($element) /svc /fi "IMAGENAME eq PROGRAM.EXE") }
解决方案
方法1:基于tasklist命令的输出判断
tasklist在未匹配到进程时会输出固定提示,我们可以捕获输出内容做判断:
$postes = @('COMPUTER1', 'COMPUTER2', 'COMPUTER3') $targetProcess = "PROGRAM.EXE" foreach ($element in $postes) { # 捕获命令输出,同时抑制错误信息(如无法连接远程机器的情况) $output = tasklist /s $element /svc /fi "IMAGENAME eq $targetProcess" 2>&1 if ($output -match $targetProcess) { Write-Host "$element : YES" } elseif ($output -match "No tasks are running") { Write-Host "$element : NO" } else { Write-Host "$element : 无法连接/未知错误" } }
方法2:使用PowerShell原生Get-Process(推荐)
PowerShell的Get-Process更适合处理进程查询,远程调用更灵活,错误处理也更清晰:
$postes = @('COMPUTER1', 'COMPUTER2', 'COMPUTER3') $targetProcess = "PROGRAM.EXE" foreach ($element in $postes) { try { # 查询远程进程,-ErrorAction Stop将非终止错误转为终止错误 Get-Process -Name $targetProcess.Replace(".EXE","") -ComputerName $element -ErrorAction Stop | Out-Null Write-Host "$element : YES" } catch [Microsoft.PowerShell.Commands.ProcessCommandException] { # 捕获进程不存在的错误 Write-Host "$element : NO" } catch { # 捕获其他错误,如权限不足、机器离线 Write-Host "$element : 无法连接/未知错误: $($_.Exception.Message)" } }
注意:使用
Get-Process时进程名不需要带.EXE后缀,所以用Replace去除后缀;执行脚本的账号需要有远程机器的管理权限。
方法3:输出结构化结果(方便后续处理)
如果需要将结果保存为表格或导出文件,可以输出自定义对象:
$postes = @('COMPUTER1', 'COMPUTER2', 'COMPUTER3') $targetProcess = "PROGRAM.EXE" $results = foreach ($element in $postes) { $status = "未知错误" try { Get-Process -Name $targetProcess.Replace(".EXE","") -ComputerName $element -ErrorAction Stop | Out-Null $status = "YES" } catch [Microsoft.PowerShell.Commands.ProcessCommandException] { $status = "NO" } catch { $status = "无法连接: $($_.Exception.Message)" } # 创建结构化对象 [PSCustomObject]@{ 计算机名 = $element 进程状态 = $status } } # 输出表格形式的结果 $results | Format-Table -AutoSize # 可选:导出到CSV文件 $results | Export-Csv -Path "进程检测结果.csv" -Encoding UTF8 -NoTypeInformation
内容的提问来源于stack exchange,提问作者mouafo
相关产品推荐
相关产品推荐

