Powershell - команда выдает исключение, повторяет предыдущую команду (циклы), пока не выполнится - PullRequest
0 голосов
/ 06 марта 2020

Есть команда, которая (на блоках 2008) выдает исключение из-за ограничения буфера.

По сути, скрипт останавливает WAUA, сбрасывает SoftwareDistribution, затем обращается к нему, чтобы восстановить SD и проверить наличие обновлений для WSUS затем проверяет, чтобы предупреждения в WSUS прекратились.

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

Stop-Service WUAUSERV
Remove-Item -Path C:\WINDOWS\SoftwareDistribution -recurse
Start-Service WUAUSERV
GPUpdate /force
WUAUCLT /detectnow
sleep 5

## This is the command I'd like to loop, if possible, when an exception is thrown ##
$updateSession = new-object -com "Microsoft.Update.Session"; $updates=$updateSession.CreateupdateSearcher().Search($criteria).Updates

WUAUCLT /reportnow 

Любая помощь будет оценена. Все, что я смог найти, - это как создать собственное исключение, а не как его обработать, когда выдается исключение, и повторять до тех пор, пока оно не завершится без ошибки.



Редактировать:

Затем, исходя из приведенного ниже ответа, я хотел бы, чтобы оно было написано, чтобы оно продолжало проверять, пока не выполнится успешно, а затем сообщит об этом обратно?

Stop-Service WUAUSERV
Remove-Item -Path C:\WINDOWS\SoftwareDistribution -recurse
Start-Service WUAUSERV
GPUpdate /force
WUAUCLT /detectnow
sleep 5
while(-not $?) {$updateSession = new-object -com "Microsoft.Update.Session"; $updates=$updateSession.CreateupdateSearcher().Search($criteria).Updates}
WUAUCLT /reportnow

Ответы [ 2 ]

1 голос
/ 06 марта 2020

Установите значение false и переворачивайте его, только если вы добились полного успеха. L oop до тех пор, пока вы не добьетесь успеха или ваш тайм-аут не превысит заданное вами значение - если вы не включите тайм-аут, вы создали бесконечное условие l oop, при котором, если хост никогда не преуспеет, он будет работать до перезагрузки.

$sts = $false
$count = 0
do {
    try {
        $updateSession = new-object -com "Microsoft.Update.Session"
        $updates=$updateSession.CreateupdateSearcher().Search($criteria).Updates
        $sts = $true
    } catch {
        ## an exception was thrown before we got to $true
    }

    $Count++
    Start-Sleep -Seconds 1
} Until ($sts -eq $true -or $Count -eq 100)
0 голосов
/ 06 марта 2020

Вы можете использовать специальный символ $? Это вернет false, если последняя команда вернулась с ошибкой, поэтому ваше время l oop будет выглядеть так:

while(-not $?)

Смотрите что это $? в powershell.

В качестве альтернативы, $error[0] дает последнее выданное сообщение об ошибке, чтобы вы могли построить некоторое время l oop вокруг этого, подобно:

while($error[0] -ne "error message")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...