2016-06-21 4 views
2

Я написал командный файл со следующими командами, чтобы проверить состояние schtasks, и я планирую поместить это в цикл.Проверить состояние SCHTASKS в пакетном файле

FOR /F %%I IN ('SCHTASKS /QUERY /S <servername> /FO LIST /TN "\MICROSOFT\deploy_db" ^| FIND /C "Running"') DO (IF %%I == 0 (SET STATUS=Running) Else (SET Status=Ready)) 
ECHO %%I 
ECHO %STATUS% 

Но я получаю эту ошибку:

ECHO is off. 
ECHO is off. 

Если я пишу следующее:

FOR /F %%I IN ('SCHTASKS /QUERY /S <servername> /FO LIST /TN "\MICROSOFT\deploy_db" ^| FIND /C "Running"') DO 
(IF %%I == 0 (SET STATUS=Running) Else (SET Status=Ready)) 
ECHO %%I 
ECHO %STATUS% 

Если я делаю над получить следующее:

The syntax of the command is incorrect 

Если я пишу следующее:

FOR /F %%I IN ('SCHTASKS /QUERY /S <servername> /FO LIST /TN "\MICROSOFT\deploy_db" ^| FIND /C "Running"') DO (IF %%I == 0 (SET STATUS=Running) Else (SET Status=Ready)) 
ECHO %STATUS% 

Если я делаю выше получаю следующее:

Running 

Может кто-нибудь, пожалуйста, помогите мне со сценарием.

+0

«* Но я получаю эту ошибку при слежении: ECHO выключен *.» - это не ошибка, это то, что вы получаете, когда вы звоните 'echo' без параметров, она сообщает положение дел. Вы заканчиваете цикл for в конце первой строки '))' и 'ECHO %% I' находится за пределами цикла. Второй из них неверен, потому что вы должны '(' в той же строке, что и 'do', а не на следующей строке. Вам также понадобится google' EnableDelayedExpansion' для ваших переменных окружения. – TessellatingHeckler

+0

Вы знаете, что PowerShell может делать '(Get-ScheduledTask 'deploy_db'). State', или' Get-ScheduledTask ', где State -eq Running' правильно? – TessellatingHeckler

+0

Как noob для Powershell, как я могу поместить его в Loop. Запустите Schtask и продолжайте проверять его завершено? –

ответ

2

Вы получаете сообщение ECHO is off. (или on), если вы только что набрали echo, после чего ничего не осталось. Это признак того, что ваши переменные пусты.

Переменная %%I теряет область действия, если вы не входите в DO часть FOR. У меня также были проблемы с запуском линии, если я не предоставил полный путь к schtasks.

Это работает для меня:

FOR /F %%I IN ('C:\Windows\System32\schtasks.exe /QUERY /S <servername> /FO LIST /TN "\MICROSOFT\deploy_db" ^| FIND /C "Running"') DO (
    IF %%I == 0 (SET STATUS=Running) Else (SET Status=Ready) 
    ECHO %%I 
) 
ECHO %STATUS% 

Если вы находитесь в цикле, то могут возникнуть проблемы с обновлением STATUS. Если это так, попробуйте:

SETLOCAL ENABLEDELAYEDEXPANSION 
FOR /F %%I IN ('C:\Windows\System32\schtasks.exe /QUERY /S <servername> /FO LIST /TN "\MICROSOFT\deploy_db" ^| FIND /C "Running"') DO (
    IF %%I == 0 (SET STATUS=Running) Else (SET Status=Ready) 
    ECHO %%I 
) 
ECHO !STATUS! 
Смежные вопросы