Скрипт Powershell Остановить процесс и продолжить - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть скрипт, где я запускаю команду shutdown.exe на списке компьютеров. Скрипт работает нормально, пока не зависнет по какой-то причине.

Есть ли способ, которым я могу "ctrl + c" команду выключения и затем перейти к следующему ПК.

вот что я использую.

buttonRestartWorkstations_Click={
#TODO: Place custom script here

$online = $checkedlistbox1.CheckedItems | where { Test-Connection -
ComputerName $_ -Count 1 -Quiet }

$computercount = $online.Items.Count

$progressbar1.Maximum = $online.Count
$progressbar1.Step = 1
$progressbar1.Value = 0

foreach ($computer in $online)

{
    $progressbar1.PerformStep()
    shutdown -r -t $textbox3.Text -m $computer
    Start-Sleep -s 1

}
$label2.Visible = $true
$label2.Text = "Selected Servers will reboot on the " + $textbox1.text

1 Ответ

0 голосов
/ 04 сентября 2018

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

Как вы утверждаете, Restart-Computer не подходит для вас, потому что вы хотите иметь задержку до перезапуска на данном компьютере (что дает вам shutdown -r -t <secs>; обратите внимание, что в то время как Restart-Computer имеет параметр -Delay, его назначение другое).

Если

  • ваши целевые компьютеры настроены для PowerShell Remoting
  • и вы можете запустить свой скрипт с повышенными правами (с правами администратора)

вы можете использовать Invoke-Command для параллельного подключения компьютеров, а затем локально запустить на них shutdown.exe (синтаксис PSv3 +):

$delay = $textbox3.Text
Invoke-Command -ComputerName $online { 
  shutdown -r -t $using:delay
  "$(('FAILED to initiate', 'Successfully initiated')[$LASTEXITCODE -eq 0]) reboot on $env:COMPUTERNAME."
} | ForEach-Object { $progressbar1.PerformStep() }

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

Если вы хотите проверить и дождаться успешных перезапусков, потребуется больше работы.

Любые ошибки выводятся на консоль красным цветом и могут быть позже рассмотрены в коллекции $Error.

Обратите внимание, что основная цель "$(('FAILED to initiate', 'Successfully initiated')[$LASTEXITCODE -eq 0]) reboot on $env:COMPUTERNAME." состоит в том, чтобы безоговорочно создавать некоторые (без ошибок) выходные данные на каждом компьютере, так что блок сценария ForEach-Object вызывается для каждого (shutdown не производит никакого Вывод stdout по умолчанию, а вывод stderr не поддерживается ForEach-Object).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...