.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
循环。
我正在努力让这个 .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
循环。