Командлет 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
).