Как отобразить код ошибки из скрипта Powershell? - PullRequest
1 голос
/ 26 апреля 2019

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

"FAILED;ErrorCode;ErrorMessage;"

Вот мой сценарий:

param([String]$Cab_Type)
$output

if(!(Test-Connection -Cn 165.100.10.10 -BufferSize 16 -Count 1 -quiet))
{
$output = "FAILED; " + $LASTEXITCODE + ";" + $error[0] + ";"
}
else
{
$output = "PASSED"
}

Write-Host $Cab_Type
Write-Host "<ScriptResult_Start>"
Write-Host $output
Write-Host "<ScriptResult_End>"

Я пытаюсь преднамеренно пропинговать адрес, который, как я знаю, потерпит неудачу.При запуске сценария он возвращает мне сообщение об ошибке, но не код ошибки.

Разве $ LASTEXITCODE не возвращает код ошибки сценария?Даже если мой скрипт сработал, он возвращает только 0 или 1?Есть ли способ получить реальный код ошибки скрипта?

Ответы [ 2 ]

1 голос
/ 28 апреля 2019

Возможно, это то, что вы ищете?

# set up a hash with possible Ping status codes
$status = @{
    11001 = 'Buffer Too Small'
    11002 = 'Destination Net Unreachable'
    11003 = 'Destination Host Unreachable'
    11004 = 'Destination Protocol Unreachable'
    11005 = 'Destination Port Unreachable'
    11006 = 'No Resources'
    11007 = 'Bad Option'
    11008 = 'Hardware Error'
    11009 = 'Packet Too Big'
    11010 = 'Request Timed Out'
    11011 = 'Bad Request'
    11012 = 'Bad Route'
    11013 = 'TimeToLive Expired Transit'
    11014 = 'TimeToLive Expired Reassembly'
    11015 = 'Parameter Problem'
    11016 = 'Source Quench'
    11017 = 'Option Too Big'
    11018 = 'Bad Destination'
    11032 = 'Negotiating IPSEC'
    11050 = 'General Failure'
}

$server = '165.100.10.10'
$ping   = (Get-WmiObject -Class Win32_PingStatus -Filter "Address='$server'").StatusCode

if (!$ping -or [int]$ping -ne 0) {
    $err = if ( $status[[int]$ping]) { $status[[int]$ping] } else { "Unknown Failure" }
    $output = "FAILED; $ping; $err"

}
else { $output = "PASSED" }

Write-Host $output

Приведенный выше пример выводит:

FAILED; 11010; Request Timed Out
0 голосов
/ 26 апреля 2019

Существует несколько способов обработки ошибок и проверки.Прежде всего, я бы хотел, чтобы вы держали основной код в блоке try/catch и фиксировали сообщение об ошибке, чтобы вы знали, что именно является ошибкой.Ниже приведена модификация вашего кода.

param([String]$Cab_Type)
$output
try
{
    if(!(Test-Connection -Cn 165.100.10.10 -BufferSize 16 -Count 1 -quiet))
    {
    $output = "FAILED; " + $LASTEXITCODE + ";" + $error[0] + ";"
    }
    else
    {
    $output = "PASSED"
    }

    Write-Host $Cab_Type
    Write-Host "<ScriptResult_Start>"
    Write-Host $output
    Write-Host "<ScriptResult_End>"
}
catch
{
    $_.Exception.Message
}

Кроме того, пройдитесь по пункту 1. ПОПРОБУЙТЕ ЗАПИСЬ В ПС

Кроме того, вы можете использовать переменную $Error, чтобы узнать обо всехошибки.

Пройдите через 2. О переменной $ Error и о том, как ее эффективно использовать

Также вам необходимо понять 3. Исключения Powershell и все, что вы когда-либо хотелизнать

Надеюсь, это поможет и даст вам направление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...