Если оператор в PowerShell зависит от того, недоступен ли сервер RPC - PullRequest
0 голосов
/ 09 мая 2019

Я пишу скрипт в PowerShell, который в идеале собирал бы информацию с другого сервера. Если он не может связаться с этим сервером, я хочу попросить пользователя вручную ввести информацию. Я знаю, как сделать все это, но я зависаю, когда сервер RPC недоступен. Я также скажу, что знаю, как исправить ошибку, когда она возникает, но я не хочу полагаться на то, что мои конечные пользователи должны будут войти и исправить это.

В качестве примера, если я запускаю:

Get-WmiObject Win32_ComputerSystem -Computer 10.5.21.94

результат, который я получаю:

Get-WmiObject : The RPC server is unavailable. (Exception from HRESULT: 0x800706BA)
At line:1 char:1
+ Get-WmiObject Win32_ComputerSystem -Computer 10.5.21.94
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [Get-WmiObject], 
COMException
+ FullyQualifiedErrorId : GetWMICOMException,Microsoft.PowerShell.Commands.GetWmiObjectCommand

Я пытаюсь найти способ написать оператор if, который проверит, доступен ли сервер RPC, но я не уверен, что нужно проверить, чтобы создать переменную true / false. , И опять же, я на самом деле не ищу кого-то, кто скажет мне, как написать оператор if, я просто пытаюсь выяснить любой запрос, который я могу запустить, чтобы определить, могу ли я правильно подключиться к этому серверу и получить результат, который можете сказать мне продолжать или нет.

Ответы [ 2 ]

1 голос
/ 09 мая 2019

Простой способ обойти это в операторе if - это просто игнорировать потенциальные сообщения об ошибках с помощью Erroraction и использовать инструкцию -not, чтобы проверить, может ли он достигнуть места назначения, или нет, а затем добавить значение $ false к переменной, если не может.

См. Пример ниже.

$status = ""
if (!(Get-WmiObject Win32_ComputerSystem -ComputerName 10.5.21.94 -ErrorAction SilentlyContinue)) {
Write-Host "Server is unavailable!"
$status += $false 
}

    else {
    Get-WmiObject Win32_ComputerSystem -ComputerName 10.5.21.94
    }

if ($status -eq $false) {
    $Server = Read-Host "Please enter the destionation"
    Get-WmiObject Win32_ComputerSystem -ComputerName $Server
}
0 голосов
/ 09 мая 2019

Было предложение для блока Try / Catch, но, поскольку это не завершающая ошибка, изначально она не работала.Затем я нашел это:

Try / catch, похоже, не дает эффекта

Там есть ответ о том, что все ошибки заканчиваются:

try {

   $ErrorActionPreference = "Stop"; #Make all errors terminating
   get-item filethatdoesntexist; # normally non-terminating
   write-host "You won't hit me";  
} catch{
   Write-Host "Caught the exception";
   Write-Host $Error[0].Exception;
}finally{
   $ErrorActionPreference = "Continue"; #Reset the error action pref to default

}

Это дало мне именно то, что я искал!

...