You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 21:47:49