2016-06-03 10 views
0

Окружающая среда: Windows Server 2008 R2Как получить код 202 из cmd-файла, запущенного Task Scheduler?

Microsoft Windows Task Scheduler выполняет DoThis.cmd файл, который всегда возвращает ERRORLEVEL в Event 201 (Success), даже если это не удалось:

задачи Планировщик успешно завершена задача «\ Why Cant This Task Fail», экземпляр «{c8655567-5f1c-4eb2-a2e1-91d2cd0405be}», действие «C: \ Windows \ SYSTEM32 \ cmd.exe» с кодом возврата 399.

Я хочу, чтобы он возвращал событие 202 (отказ), если есть ненулевой ERRORLEVEL и событие 201 (успех), если возвращается ноль.

Мой Пакетный файл DoThis.cmd содержит

RETURN 399 

Спасибо, ~ Shaun

+0

Вместо 'RETURN', как насчет' EXIT/B 399'? – lit

ответ

0

Я не считаю, что это возможно по умолчанию. Задача выполнена успешно, в том смысле, что она запускалась в запланированное время и запускала любое приложение (приложения), которое вы хотели. Тот факт, что одно из приложений вызвало ошибку, не относится к проблеме планировщика заданий.

Однако, я был в состоянии достигнуть почти то, что вы хотите: вы можете поднять ошибку на одно из действий (не на самой задаче), убедившись, что задача не может найти программу, должен выполняться как часть задачи.

Так что я создал задачу, которая работает 3 действия:

  1. MyActualBatch.cmd
  2. MyExe.exe
  3. MyResult.cmd

MyBatch.cmd файла содержит следующий код:

@echo off 
if exist MyExe.exe del MyExe.exe 
if exist result.cmd del result.cmd 
set myError=0 
:: *********** Do all your processing here ********** 
:: ..... 
:: Store your specific error code in %myError%, or to 0 to indicate success e.g.: 
     set myError=399 
:: ..... 
:: *********** End batch file with following lines ********** 
if /I %myError% EQU 0 (
    :: No error, so let's copy some small executable that the task can actually run 
    :: without impacting the results of the task 
    copy /y C:\Windows\System32\ipconfig.exe MyExe.exe > nul 
) 
:: Create a batch file that will instantly exit using the original error code 
:: created in this one 
echo exit /b %myError% > result.cmd 
exit /b %myError% 

(или, без комментариев, которые загромождают экран):

@echo off 
if exist MyExe.exe del MyExe.exe 
if exist result.cmd del result.cmd 
set myError=399 
if /I %myError% EQU 0 (
    copy /y C:\Windows\System32\ipconfig.exe MyExe.exe > nul 
) 
echo exit /b %myError% > result.cmd 
exit /b %myError% 

Всякий раз, когда ваш пакетный файл должен вызвать ошибку, вы установите myError переменное значение, которое вы хотите вернуть (я предпочитаю с помощью моего а не полагаться на систему ERRORLEVEL var, которая может быть сброшена практически любым действием).

В конце скрипта некоторый код проверяет, содержит ли myError var 0 (что означает отсутствие ошибки). Если это так, то пакет создает исполняемый файл с именем MyExe.exe, что задача будет выполнена сразу после завершения этого командного файла.Но если myError содержит другое значение ошибки, тогда файл MyExe не будет создан, что вызовет ошибку 203 в задаче при попытке запустить ее дальше.

И наконец, файл Result.cmd также создан, поэтому его можно запустить как последнее действие этой задачи, создав код ошибки, который вы создали в первой задаче.

Примечание: файл MyExe является только копией IpConfig.exe. Я выбрал этот исполняемый файл просто потому, что AFAIK доступен во всех версиях Windows, он маленький, и он просто перечисляет информацию, поэтому он не может сломать что-либо, работая как часть задачи.