Ввод и вывод foreach в столбцы таблицы - PullRequest
0 голосов
/ 04 мая 2018

В настоящее время я хочу проверить, запущен ли список процессов, а затем отобразить результат в таблице, такой как:

 Process        Status
 =======        ======
Process 1       Running
Process 2      Not Running
Process 3       Running

У меня есть код ниже, который производит вывод, показывающий каждый ввод и вывод в виде строки, но это выглядит грязно в зависимости от длины имени процесса.

$Node = Read-Host -Prompt 'Input Node name'

$Process = @("Process1", "Process2", "Process3")
$Process | foreach-object {if(!(Get-Process -Name $_ -ComputerName $Node - ErrorAction SilentlyContinue)) {"$_     -     Not Running"} else {"$_     -    Running"}}

Я в растерянности. Вся помощь оценена.

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Лучше (быстрее) сделать один удаленный вызов, чтобы получить все процессы, чем по одному на процесс, поэтому сделайте это и сохраните все результаты - по крайней мере, имена процессов.

Следующая часть нетривиальна. PowerShell и аккуратно отформатированные таблицы работают так, что для каждой строки таблицы создается один объект (все вместе), причем каждый объект имеет свойства для каждого имени столбца.

# Processes to look for
$Process = @("Process1", "Process2", "Process3")

$Node = Read-Host -Prompt 'Input Node name'

# Get running processes, and only keep their names
$runningProcesses = Get-Process -ComputerName $Node -ErrorAction SilentlyContinue | 
    Select-Object -ExpandProperty Name


$Process | ForEach-Object {

    # For each process name to look for, generate a hashtable of
    # columns and their values,
    # then cast it into a PS Object

    [PSCustomObject]@{

        'ProcessName' = $_
        'Status' = if ($runningProcesses -contains $_) { "Running" } else { "Not Running" }

    }

}

Это дает аккуратный форматированный вывод таблицы, а также структурированные данные, так что вы можете записать вывод этого в | ForEach-Object { $_.Status } и выбрать отдельные части по имени, что вы не можете сделать так же аккуратно, используя свой форматированный формат .

0 голосов
/ 04 мая 2018

Попробуйте это:

$node = Read-Host -Prompt 'Input Node name'

$processList = "Process1", "Process2", "Process3"

$processList |
    ForEach-Object {
        [PsCustomObject]@{
            NodeName = $node
            ProcessName = $_
            IsRunning = (Get-Process -Name $_ -ComputerName $node -ErrorAction SilentlyContinue | Select-Object -First 1) -ne $null
        }
    }

Вывод будет таким:

NodeName   ProcessName IsRunning
--------   ----------- ---------
Node1      Process1    True
Node1      Process2    True
Node1      Process3    False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...