2015-07-05 5 views
1

Я пишу небольшой скрипт в PowerShell для Nagios, который проверяет, существует ли файл. Если он существует, статус должен быть «хорошо», а если нет, он должен быть «критическим».скрипт проверки файла не поднимает критический флаг, когда файл не существует

Проблема в том, что файл не существует, статус не является «критическим», он показывает в Nagios как «неизвестный».

$path = "c:\test\test.txt" 
$critical = 2 
$ok = 0 

if (-not (Test-Path $path)) { 
    Write-Host "file not exists" 
    exit $critical 
} else { 
    Write-Host "file exists" 
    exit $ok 
} 
+0

как Nagios получить выход ? по коду выхода или определенной строке? – Avshalom

+0

Я тестировал ваш код так, как есть, и он извлекает 2, когда не найден, и 0 при его обнаружении, проверьте это в powershel с переменной $ LASTEXITCODE после окончания скрипта – Avshalom

+0

Спасибо сейчас Work :) – fectionn

ответ

3

Там нет ничего плохого с кодом, хотя я бы, вероятно, оптимизировать его так:

$path = "c:\test\test.txt" 

$fileMissing = -not (Test-Path -LiteralPath $path) 

$msg = if ($fileMissing) {'file does not exist'} else {'file exists'} 

Write-Host $msg 
exit ([int]$fileMissing * 2) 

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

powershell.exe -Command "&{& 'C:\path\to\your.ps1'}" 

или вроде этого:

cmd /c echo C:\path\to\your.ps1 | powershell.exe -Command - 

возвращаемое значение равно 1, если произошла ошибка, или 0 в противном случае, независимо от того, что ExitCode вас задавать.

Чтобы PowerShell вернуть правильный код выхода вам нужно добавить exit $LASTEXITCODE в командную строку:

powershell.exe -Command "&{& 'C:\path\to\your.ps1'; exit $LASTEXITCODE}" 

или вызвать скрипт, используя -File параметр:

powershell.exe -File "C:\path\to\your.ps1" 
+0

Спасибо, мой друг :) Теперь его работа прекрасна. – fectionn