Оператор if в PowerShell зависит от того, недоступен ли сервер RPC

Я пишу сценарий в 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, я просто пытаюсь выяснить любой запрос, который я могу запустить, чтобы определить, могу ли я правильно подключиться к этому серверу и получить результат, который может сказать мне продолжать или нет.


person Christopher Cass    schedule 09.05.2019    source источник
comment
Вы можете изучить использование Test-WSMan (docs.microsoft.com/en-us/powershell/module/) или с помощью блоков Try / Catch.   -  person I.T Delinquent    schedule 09.05.2019
comment
проверьте доступность порта rpc с помощью PowerShell: blogs.technet.microsoft.com/ runcmd /   -  person f6a4    schedule 09.05.2019


Ответы (2)


Простой способ обойти это с помощью оператора 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
}
person Ezzi    schedule 09.05.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

}

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

person Christopher Cass    schedule 09.05.2019