Синтаксическая ошибка в .bat файле - PullRequest
0 голосов
/ 26 июня 2018

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

Где я иду не так?

schtasks /Query /nh /fo CSV | findstr /i /c:"searchcriteria" | FOR /f "tokens=1 delims=," %%f IN ('more') DO (
    :loop

    FOR /f "tokens=*" %%a IN ('schtasks /query /nh /fo CSV /tn %%f ^| findstr /i /c:"running"') DO SET task=%%a

    IF [%task%] == [] (
        schtasks /change /tn %%f /DISABLE
    ) ELSE (
        GOTO loop
    )
)

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

Что насчёт этого (не проверено):

for /F "tokens=1 delims=," %%F in ('schtasks /QUERY /NH /FO CSV ^| findstr /I /C:"searchcriteria"') do call :LOOP %%F
goto :EOF

:LOOP
    set "task="
    for /F "tokens=*" %%A in ('schtasks /QUERY /NH /FO CSV /TN %1 ^| findstr /I /C:"running"') do set "task=%%A"
    if not defined task (
        schtasks /CHANGE /TN %1 /DISABLE
    ) else (
        > nul timeout 1
        goto :LOOP
    )

Это позволяет избежать попадания цикла goto в заключенный в скобки блок кода, поскольку goto нарушает контекст блока. Значение из первого цикла for /F в %%F равно передается подпрограмме :LOOP в качестве аргумента, который затем читается %1.

Кроме того, я заменил more в первом цикле for /F на первую командную строку schtasks / findstr, чтобы избежать нескольких каналов, как в любом случае вы сделали это во втором цикле for /F.

0 голосов
/ 26 июня 2018

Следующее похоже на работу. Я изменил одинарные кавычки во втором цикле for на двойные кавычки и добавил скобки для этого цикла.

schtasks /Query /nh /fo CSV | findstr /i /c:"time" | FOR /f "tokens=1 delims=," %%f IN ('more') DO (
    :loop
    FOR /f "tokens=*" %%a IN ("schtasks /query /nh /fo CSV /tn %%f ^| findstr /i /c:"running"") DO (
        SET task=%%a

        IF [%task%] == [] (
            schtasks /change /tn %%f /DISABLE
        ) ELSE (
            GOTO loop
        )
    )
)

Обновление: ачипфл прав. Его ответ работает для меня

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

@echo off
set querystring="time"

schtasks /Query /nh /fo CSV | findstr /i /c:"%querystring%" | FOR /f "tokens=1,3 delims=," %%f IN ('more') DO (
      if %%g=="running" (
        schtasks /change /tn %%f /Disable
        schtasks /end /tn %%f
      )
)
schtasks /Query /nh /fo CSV | findstr /i /c:"%querystring%" | FOR /f "tokens=1,3 delims=," %%f IN ('more') DO (
      if %%g=="running" (
        call test2.bat
        exit /b 0
      )
)

schtasks /Query /nh /fo CSV | findstr /i /c:"%querystring%"

Обновление 2: комбинация

for /F "tokens=1,3 delims=," %%F in ('schtasks /QUERY /NH /FO CSV ^| findstr /I /C:"searchcriteria"') do call :LOOP %%F %%G
goto :EOF

:LOOP
    schtasks /CHANGE /TN %1 /DISABLE
    if %2=="running" schtasks /END /TN %1 & call :WAIT %1
    goto :EOF

:WAIT
    FOR /F "tokens=3 delims=," %%F IN ('schtasks /Query /nh /fo CSV /tn %1') DO set "test=%%F"
    if %test%=="running" GOTO :WAIT

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