.bat 文件中的语法错误

Syntax error in .bat file

我正在努力让这个 .bat 工作,但它一直在抛出 "syntax error"。这个批处理文件应该获取所有匹配名称标准的计划任务并禁用它们,等待它们在 运行.

时终止执行。

我哪里错了?

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
    )
)

以下似乎可行。我将第二个 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
        )
    )
)

更新: achipfl 是对的。他的回答对我有用

我也再次尝试并提出了以下解决方案。 首先它禁用任务的调度,然后结束任务。 然后,如果任务仍然是 运行,它会再次调用批处理文件。我不确定你是否想结束任务。但是因为你喜欢等待任务完成执行我已经假设了。

@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%"

更新二: 组合

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

这个怎么样(未测试):

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 破坏了块上下文。 %%F 中第一个 for /F 循环的值是 作为参数传递给子例程 :LOOP,然后由 %1.

读取

此外,我用第一个 schtasks/findstr 命令行替换了第一个 for /F 循环中的 more 以避免多个管道,就像您在无论如何,你的第二个 for /F 循环。