Как передать другой вывод при использовании PowerShell "Restart-Computer" - PullRequest
0 голосов
/ 08 апреля 2020

У меня есть CSV-файл

SERVERS|SEQUENCE|INDEX
ServerA|  1     | 1.1
ServerB|  1     | 2.1
ServerC|  2     | 3.1

А вот мой код

#importing csv into ps$
$csv = Import-Csv "sequencing.csv"

#Grouping & Sort data from csv
$objdata = $csv | Select SERVERS,SEQUENCE | Group SEQUENCE | Select @{n="SEQUENCE";e={$_.Name}},@{n="SERVERS";e={$_.Group | ForEach{$_.SERVERS}}} | Sort SEQUENCE
foreach ($d in $objdata)
    {
        $order = $d.SEQUENCE
        $cNames = $d.SERVERS

        if (Restart-Computer -ComputerName $cNames -Force -Wait -For Wmi -Delay 1 -ErrorAction SilentlyContinue)
            {
                 write-host "$cNames is rebooting" -ForegroundColor Green
            }
        else
            {
            Write-Host "Unable to reboot $cNames remotely, Please do it manually" -ForegroundColor Red
            }
    }

Я пытаюсь последовательно перезагрузить несколько серверов и передать результаты через 2 разных результата. Из моего кода все серверы перезагрузятся, но будут выводиться через оператор else . Кто-нибудь может указать мне правильное направление? Любая помощь будет оценена.

1 Ответ

0 голосов
/ 08 апреля 2020

Как уже указывалось Lee_Daily , Restart-Computer ничего не возвращает. Это означает, что вам придется использовать блок try/catch.

Чтобы убедиться, что в случае ошибки вы действительно вводите блок catch, вам нужно установить для параметра ErrorAction значение Stop.

В вашем коде вы показываете CSV для импорта, в котором в качестве разделителя используется символ трубопровода |, поэтому вам нужно указать это в командлете Import-Csv.

Из вашего последнего комментария я понял, что вы хотите l oop один компьютер за раз, вместо того, чтобы перезагружать несколько компьютеров одновременно, вы будете знать, какие ошибки компьютера.

Попробуйте:

# importing csv into ps$
$csv = Import-Csv "D:\sequencing.csv" -Delimiter '|'

# Grouping & Sort data from csv
$objdata = $csv | Select-Object SERVERS,SEQUENCE | 
                  Group-Object SEQUENCE | 
                  Select-Object @{Name = "SEQUENCE"; Expression = {$_.Name}},
                                @{Name = "SERVERS"; Expression = {$_.Group.SERVERS}} | 
                  Sort-Object SEQUENCE

$objdata | ForEach-Object {
    foreach ($server in $_.SERVERS) {
        try {
            Restart-Computer -ComputerName $server -Force -Wait -For Wmi -Delay 1 -ErrorAction Stop
            Write-Host "Server $server is rebooting" -ForegroundColor Green
        }
        catch {
            Write-Host "Unable to reboot $server remotely, Please do it manually" -ForegroundColor Red
        }
    }
}

Видя ваш последний комментарий, я понимаю, что вы только хотите перезагрузить серверы, где значение SEQUENCE в CSV установлено в «1». Правильно?

Кроме того, вы хотите перезапустить серверы одновременно, но также хотите иметь возможность увидеть, какой сервер не перезапустился. Может быть, вы можете сделать это с помощью Restart-Computer -AsJob, но я считаю, что это работает только в PowerShell 5.1

Ниже код отфильтровывает все серверы с SEQUENCE, установленным в 1, и перезапускает их по одному за раз (как требуется в Ваш первоначальный вопрос " Я пытаюсь перезагрузить несколько серверов в последовательности "):

# import csv data
$csv = Import-Csv "D:\sequencing.csv" -Delimiter '|'  # change this to the delimiter actually used in the CSV !

# get the list of servers where SEQUENCE is set to '1'
$servers = $csv | Select-Object SERVERS,SEQUENCE |
                  Where-Object { $_.SEQUENCE.Trim() -eq '1' } |
                  ForEach-Object { $_.SERVERS.Trim() }

foreach ($server in $servers) {
    try {
        Restart-Computer -ComputerName $server -Force -Wait -For Wmi -Delay 1 -ErrorAction Stop
        Write-Host "Server $server is rebooting" -ForegroundColor Green
    }
    catch {
        Write-Host "Unable to reboot $server remotely, Please do it manually" -ForegroundColor Red
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...