Возврат отказа, если файл не существует - PullRequest
0 голосов
/ 14 ноября 2018

Я запускаю приведенный ниже скрипт в агенте SQL Server.

Все последующие шаги в работе зависят от этого шага.Это довольно просто Поиск файла и завершается с ошибкой, если файл не найден.

  $file = "C:\\Data\\FileDrop\\.done"
  $CheckFile = Test-Path -Path $file

  if (!($CheckFile))  {exit 1 } 

Однако, когда задание агента выполняется, он говорит, что шаг не выполнен, потому что файл не найден и существует с кодом 0 - успех.

Что я здесь не так делаю?

Ответы [ 3 ]

0 голосов
/ 15 ноября 2018

Я не думаю, что возвращаемое значение / код ошибки задания имеет какое-либо отношение к какому-либо значению, которое возвращает скрипт.

Если вы хотите потерпеть неудачу с сообщением об ошибке, попробуйте это:

# make sure to stop on errors
$ErrorActionPreference = 'Stop'
$path = 'C:\Data\FileDrop\.done'
# check for file explicitly (in case a directory with that name exists)
if(![System.IO.File]::Exists($path)) {
    # throwing an exception will abort the job
    throw (New-Object System.IO.FileNotFoundException("File not found: $path", $path))
}
# anything after this will not be executed on error...

Это должно полностью провалить задание и отобразить сообщение об ошибке в истории задания.

0 голосов
/ 16 ноября 2018

Это не будет хорошим ответом, потому что я не нашел документации, объясняющей это, но использование Exit, за которым следует число, похоже, не влияет на код выхода.

Следующеепример работает, с общей идеей, взятой из блога .Сначала создайте тестовый сценарий, подобный следующему:

$host.SetShouldExit(12345)
exit

Затем вызовите этот сценарий из командной строки Powershell, как в следующем примере:

$command = "C:\YourTestScriptPathAndName.ps1"
Powershell -NonInteractive -NoProfile -Command $command

Сценарий запустится и завершится, изатем мы можем проверить код выхода из приглашения Powershell, записав содержимое $ LASTEXISTCODE

$LASTEXITCODE

В этом случае $ LASTEXISTCODE будет содержать 12345.

В случае использования этого сTest-Path это выглядело бы так:

#using a path that does not exist
if(Test-Path -Path 'C:\nope'){
   $host.SetShouldExit(1234)
}
else{
   $host.SetShouldExit(2222)
}

Это устанавливает код выхода на 2222 при вызове из командной строки, но когда я вызываю этот тестовый скрипт из другого скрипта, а не из командной строки, $Переменная LASTEXITCODE по-прежнему имеет значение 0.

0 голосов
/ 15 ноября 2018

Может быть, это то, что вы ищете:

if(!(Test-Path "C:\Data\FileDrop\.done")){
    return 1
}
else {
    return 0
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...