Windows .bat文件中存在语法错误
我正在努力使这个.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
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