我正在努力使此.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
)
)
答案 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
仍会循环。