Windows .bat文件中存在语法错误

Windows .bat文件中存在语法错误,windows,batch-file,cmd,command-prompt,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

我正在努力使这个.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
    )
)

下面的方法似乎有效。我将第二个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

下面的方法似乎有效。我将第二个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
那么这个呢(未经测试):

for/F“tokens=1 delims=,”%%F in('schtasks/QUERY/NH/FO CSV^ | findstr/I/C:“searchcriteria”')执行调用:循环%%F
后藤:EOF
:循环
设置“任务=”
对于('schtasks/QUERY/NH/FO CSV/TN%1^ | findstr/I/C:“running”')中的/F“tokens=*”%%A,请设置“task=%%A”
如果未定义任务(
schtasks/更改/TN%1/禁用
)否则(
>nul超时1
转到:循环
)
这避免了
goto
循环位于带括号的代码块内,因为
goto
会中断块上下文。
%%F
中/F的第一个
循环的值为
作为参数传递给子程序
:LOOP
,然后由
%1
读取

此外,我用第一个
schtasks
/
findstr
命令行替换了第一个
for/F
循环中的
more
,以避免使用多个管道,就像您在第二个
for/F
循环中所做的那样。

这是什么(未测试):

for/F“tokens=1 delims=,”%%F in('schtasks/QUERY/NH/FO CSV^ | findstr/I/C:“searchcriteria”')执行调用:循环%%F
后藤:EOF
:循环
设置“任务=”
对于('schtasks/QUERY/NH/FO CSV/TN%1^ | findstr/I/C:“running”')中的/F“tokens=*”%%A,请设置“task=%%A”
如果未定义任务(
schtasks/更改/TN%1/禁用
)否则(
>nul超时1
转到:循环
)
这避免了
goto
循环位于带括号的代码块内,因为
goto
会中断块上下文。
%%F
中/F
的第一个
循环的值为
作为参数传递给子程序
:LOOP
,然后由
%1
读取


此外,我用第一个
schtasks
/
findstr
命令行替换了第一个
for/F
循环中的
more
,以避免使用多个管道,就像您在第二个
for/F
循环中所做的那样。

我相信systax错误是由
if
引起的,因为它不喜欢管道(
). 如果未定义任务,请尝试使用
,如果未定义任务,请尝试使用
^
加两个空格)…尝试了这两种方法,但仍然抛出“语法错误”:\n好的。。。另外,尝试在
for
循环的周围加上括号(因此您有
。|(for/F…)
…不,仍然抛出@aschipfl可能是第二个for循环中的命令内的%%f?如果是这样,我应该如何编写它?现在我意识到在一个带括号的代码块内有一个
goto
循环,它无法工作,因为
goto
会破坏块上下文。我会将
goto
循环甚至外部循环
for/F
循环到一个子例程中并使用
call
。此外,我将
timeout 1
放入
goto
循环中,以避免沉重的处理器负载……我相信systax错误是由
if
引起的,因为它不喜欢管道(
)。如果未定义任务,请尝试使用
,如果未定义任务,请尝试使用
。(
^
加上两个空格)…尝试这两种方法,但仍然抛出“语法错误”:\好的……尝试在
循环周围添加括号(因此您有
。|(用于/F…)
…不,仍然抛出@aschipfl可能是第二个for循环中的命令内的%%f?如果是这样,我应该如何编写它?现在我意识到在一个带括号的代码块内有一个
goto
循环,它无法工作,因为
goto
会破坏块上下文。我会将
goto
循环甚至外部循环
for/F
循环到一个子例程中,并使用
call
。此外,我将
timeout 1
放入
goto
循环中,以避免沉重的处理器负载…工作起来很有魅力!谢谢这完全是错误的!单引号告诉
for/F
字符串是要执行的命令行,双引号告诉t这是一个文字字符串!并且
goto
循环不能在括号内的代码块中使用!我真的很惊讶你的答案被接受了…正如@aschipfl所指出的那样,最后一个for循环永远不会设置任务变量,因此如果任务正在运行,总是在不等待的情况下禁用它。工作起来很有魅力!谢谢你这是简单的说明g!单引号告诉
for/F
字符串是要执行的命令行,双引号告诉它是一个文本字符串!和一个
goto