首先,我应该提一下我的代码的上下文,它的目的是检查我的计算机上的自动维护任务(或Windows是否引用它,"常规维护")在同一天开始(如果是这样,最后一次运行的日期和时间将与运行此代码的日期相匹配,时间将是12:00:00 pm)并且如果它已经完成(如果是,那么任务&# 39; s状态将是" Ready"而不是" Running"。
然后,代码将在一个名为%maintenance completion%的变量中存储三个检查(0表示成功,1表示失败)中的每一个的值,稍后我将用它来决定是否继续下一部分代码,或者我是否应该回到所有条件都是真的。
FOR /f "tokens=4" %%A IN ('schtasks /query /v /fo list /tn "Microsoft\Windows\TaskScheduler\Regular Maintenance" ^| findstr /c:"Last Run Time:"') DO set last_maintenance_date=%%A
FOR /f "tokens=5" %%A IN ('schtasks /query /v /fo list /tn "Microsoft\Windows\TaskScheduler\Regular Maintenance" ^| findstr /c:"Last Run Time:"') DO set last_maintenance_time=%%A
FOR /f "tokens=2" %%A IN ('schtasks /query /v /fo list /tn "Microsoft\Windows\TaskScheduler\Regular Maintenance" ^| findstr /c:"Status:"') DO set maintenance_status=%%A
FOR /f "tokens=1" %%A IN ('date /t') DO set current_date=%%A
IF /i %maintenance_date% EQU %current_date% (echo date_success & set maintenance_completion=0) ELSE (echo date_fail & set maintenance_completion=1) & set maintenance_completion
IF /i %maintenance_time% EQU 12:00:00 (echo time_success & set maintenance_completion=%maintenance_completion%0) ELSE (echo time_fail & set maintenance_completion=%maintenance_completion%1) & set maintenance_completion
IF /i %maintenance_status% EQU Ready (echo status_success & set maintenance_completion=%maintenance_completion%0) ELSE (echo status_fail & set maintenance_completion=%maintenance_completion%1) & set maintenance_completion
IF %maintenance_completion% EQU 000 (echo success) ELSE (echo %maintenance_completion%)
当我在提升的命令提示符窗口中运行此代码时(%% A被调整为%A),代码运行正常并产生我通常期望的结果:
C:\Windows\system32>FOR /f "tokens=4" %A IN ('schtasks /query /v /fo list /tn "M
icrosoft\Windows\TaskScheduler\Regular Maintenance" ^| findstr /c:"Last Run Time
:"') DO set last_maintenance_date=%A
C:\Windows\system32>set last_maintenance_date=01/08/2015
C:\Windows\system32>FOR /f "tokens=5" %A IN ('schtasks /query /v /fo list /tn "M
icrosoft\Windows\TaskScheduler\Regular Maintenance" ^| findstr /c:"Last Run Time
:"') DO set last_maintenance_time=%A
C:\Windows\system32>set last_maintenance_time=21:16:52
C:\Windows\system32>FOR /f "tokens=2" %A IN ('schtasks /query /v /fo list /tn "M
icrosoft\Windows\TaskScheduler\Regular Maintenance" ^| findstr /c:"Status:"') DO
set maintenance_status=%A
C:\Windows\system32>set maintenance_status=Ready
C:\Windows\system32>FOR /f "tokens=1" %A IN ('date /t') DO set current_date=%A
C:\Windows\system32>set current_date=03/08/2015
C:\Windows\system32>IF /i %maintenance_date% EQU %current_date% (echo date_succe
ss & set maintenance_completion=0) ELSE (echo date_fail & set maintenance_comple
tion=1)
date_fail
C:\Windows\system32>set maintenance_completion
maintenance_completion=1
C:\Windows\system32>IF /i %maintenance_time% EQU 12:00:00 (echo time_success & s
et maintenance_completion=%maintenance_completion%0) ELSE (echo time_fail & set
maintenance_completion=%maintenance_completion%1)
time_fail
C:\Windows\system32>set maintenance_completion
maintenance_completion=11
C:\Windows\system32>IF /i %maintenance_status% EQU Ready (echo status_success &
set maintenance_completion=%maintenance_completion%0) ELSE (echo status_fail & s
et maintenance_completion=%maintenance_completion%1)
status_success
C:\Windows\system32>set maintenance_completion
maintenance_completion=110
C:\Windows\system32>IF %maintenance_completion% EQU 000 (echo success) ELSE (ech
o %maintenance_completion%)
110
但是,当我将其作为批处理脚本运行时,我收到此错误:
C:\Windows\system32>FOR /F "tokens=4" %A IN ('schtasks /query /v /fo list /tn "M
icrosoft\Windows\TaskScheduler\Regular Maintenance" | findstr /c:"Last Run Time:
"') DO set last_maintenance_date=%A
C:\Windows\system32>set last_maintenance_date=01/08/2015
C:\Windows\system32>FOR /F "tokens=5" %A IN ('schtasks /query /v /fo list /tn "M
icrosoft\Windows\TaskScheduler\Regular Maintenance" | findstr /c:"Last Run Time:
"') DO set last_maintenance_time=%A
C:\Windows\system32>set last_maintenance_time=21:16:52
C:\Windows\system32>FOR /F "tokens=2" %A IN ('schtasks /query /v /fo list /tn "M
icrosoft\Windows\TaskScheduler\Regular Maintenance" | findstr /c:"Status:"') DO
set maintenance_status=%A
C:\Windows\system32>set maintenance_status=Ready
C:\Windows\system32>FOR /F "tokens=1" %A IN ('date /t') DO set current_date=%A
C:\Windows\system32>set current_date=03/08/2015
**03/08/2015 was unexpected at this time.**
C:\Windows\system32>**IF /i EQU 03/08/2015** (echo date_success & set maintenance_c
ompletion=0) ELSE (echo date_fail & set maintenance_completion=1) & set maintena
nce_completion
此外,如果我替换失败的行上的第一个变量(%maintenance_date%)及其等效的字符串文字(01/08/2015),那么该行运行正常,然后下一行因为与该行上的第一个变量相同的问题(%maintenance_time%)。
这让我相信,出于某种原因,将代码作为批处理文件运行会导致一些错误,因为将变量作为IF语句中的第一项,但我不确定究竟是什么问题是或我如何解决它?
答案 0 :(得分:0)
弄清楚出了什么问题!这是我的语法错误,因为我写了IF /i %maintenance_date%
和IF /i %maintenance_time%
而不是%last_maintenance_date%
和%last_maintenance_time%
!
再次感谢你的建议aschipfl。