csv 使用PowerShell在特定机器上运行的进程或程序

0qx6xfy6  于 2023-06-19  发布在  Shell
关注(0)|答案(2)|浏览(101)

我是编程世界和PowerShell脚本的新手。我的同事给了我这个命令,让我运行它来确定程序PROGRAM.EXE是否在一个计算机列表上运行。但我发现很难在50多台机器上做到这一点。我想使用powershell的forEach函数来运行它。这是我已经做的,但我没有得到预期的结果。通常他使用这个> tasklist /s COMPUTER1 /svc /fi "IMAGENAME eq PROGRAM.EXE")这给了几个结果,当程序安装时,它返回名称,和程序的PID,否则它说aucune tƒche en service ne correspond aux critŠres sp‚cifi‚s.我想使用它,但与powershell,与计算机列表。
这是我尝试过的,但我觉得bloked

$postes = @('COMPUTER1', 'COMPUTER2', 'COMPUTER3')

Foreach($element in $postes) 
{ 
    $( tasklist /s $($element) /svc /fi "IMAGENAME eq PROGRAM.EXE")
}

我希望切换情况下的结果,如果或没有程序安装.但结果是无法控制的。有人能帮帮我吗。
谢谢大家。

tp5buhyn

tp5buhyn1#

根据您要查询的远程计算机的数量,您可以检查是否可以在循环中访问每台计算机并仅查询联机计算机。比如这样:

$computerList = Get-Content -Path 'c:\files\mycomputer.txt'
$NomProgramme = 'XWin_MobaX'

$data = 
foreach ($computer in $computerList) {
    if (Test-Connection -ComputerName $computer -Count 1 -Quiet) {
        Invoke-Command -ComputerName $computer -HideComputerName -ScriptBlock {
            [PSCustomObject]@{
                Computer       = $ENV:COMPUTERNAME 
                Online         = $True
                ProgramRunning = if (Get-Process -Name $USING:NomProgramme -ErrorAction SilentlyContinue) { $True } else { $false }  
            }
        } |
            Select-Object -ExcludeProperty RunspaceId
    }
    else {
        [PSCustomObject]@{
            Computer       = $computer 
            Online         = $false
            ProgramRunning = 'n/a'  
        }
    }
} 
$data | Format-Table -AutoSize
$data | Export-Csv -Path c:\files\Services.csv -NoTypeInformation

如果你真的有很多计算机要检查,你可以切换到PowerShell版本7,并使用其内置功能与Foreach-Object -Parallel并行运行命令。Get-Help Foreach-Object

nc1teljy

nc1teljy2#

如果您具有远程访问这些计算机的权限,并且在这些计算机上启用了WMI,则可以使用Get-WmiObject cmdlet。

$computers = Get-Content -Path computers.txt # Text file with one computer on each line
foreach($computer in $computers){
    $processes = Get-WmiObject -ComputerName $computer -Query "SELECT Name FROM Win32_Process WHERE Name = 'PROGRAM.EXE'"
    $programRunning = $processes.Count -gt 0
    [PSCustomObject]@{ Computer = $computer; ProgramRunning = $programRunning }
}

如果你更喜欢一句话:

cat computers.txt|%{[pscustomobject]@{Computer=$_;Running=[bool](gwmi -cn $_ -q "Select * FROM Win32_Process WHERE Name='PROGRAM.EXE'")}}

如果您需要快速运行它,我建议您使用PowerShell库中的PSParallel模块并行运行它。
这将允许您在一行程序中使用Invoke-Parallel cmdlet:

Install-Module PSParallel -Scope CurrentUser
cat computers.txt|Invoke-Parallel{[pscustomobject]@{Computer=$_;Running=[bool](gwmi -cn $_ -q "Select * FROM Win32_Process WHERE Name='PROGRAM.EXE'")}}

相关问题