Командлет PowerShell start-sleep

Привет, я новичок в PowerShell и нашел один из полезных скриптов Эда Уилсона в его блоге: http://blogs.technet.com/b/heyscriptingguy/archive/2012/11/12/force-a-обновлениегрупповойполитикидоменаспомощьюpowershell.aspx.

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

Я просто буду использовать его код, потому что все, что я сделал, это заменил его своими учетными данными и информацией AD:

$cn = Get-ADComputer -filt *
$cred = Get-Credential iammred\administrator
$session = New-PSSession -cn $cn.name -cred $cred
icm -Session $session -ScriptBlock {gpupdate /force}

Я добавил следующие две строки, чтобы попытаться приостановить скрипт, чтобы разрешить обработку gpupdate, а затем перезагрузить компьютер (ы):

Start-Sleep -s 120
Restart-Computer -ComputerName $cn.name

Когда я запускаю сценарий все вместе, кажется, что он просто зависает после того, как я ввожу свои учетные данные. Я предполагаю, что ему не нравится то, как я представляю командлет Start-Sleep, потому что я могу успешно запустить командлет Restart-Computer без Start-Sleep. Проблема в том, что он не ждет завершения gpupdate, поэтому политика не активируется. Я не получаю никаких ошибок при запуске скрипта, он просто зависает. Я оставил его работать около 10 минут без успеха.

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


person Grass Ark    schedule 02.05.2014    source источник


Ответы (2)


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

$job = icm -Session $session -ScriptBlock {gpupdate /force} -AsJob
Wait-Job $job -Timeout 120
Remove-PSSession $session
Restart-Computer $cn.name
person Keith Hill    schedule 02.05.2014
comment
Большое спасибо. Отлично работает, спасибо за пример использования командлета -AsJob. Я читал об этом, но не знал, как правильно его использовать. - person Grass Ark; 02.05.2014

@Кит Хилл прав, сон выглядит хорошо. Еще одна вещь, которую вы можете сделать, это отправить команды сна/перезагрузки на ваши целевые машины:

icm -Session $session -ScriptBlock {
    gpupdate /force; Start-Sleep -s 120; Restart-Computer -Force}
person Raf    schedule 02.05.2014
comment
Когда я добавил этот код, я получил сообщение об ошибке, говорящее о том, что клиент не может подключиться к месту назначения. Я убедился, что машина, на которой я это тестирую, принимает запросы через winrm quickconfig. Что-нибудь еще, что мне может понадобиться сделать? Кстати, спасибо за помощь. - person Grass Ark; 02.05.2014