.bat文件中的语法错误

时间:2018-06-26 10:11:16

标签: windows batch-file cmd command-prompt

我正在努力使此.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 :(得分:1)

以下似乎有效。我将第二个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%"

更新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

答案 1 :(得分:1)

这(未试用)呢?

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仍会循环。