Как уже указывалось 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
}
}