为什么这段代码不能正常工作?
对不起,我无法理解如何发布代码,所以这里是代码的图像:
![在此处输入图片说明] [1](另请点击链接,因为我是新用户,我还无法发布图片)
命令提示符是否能够正确执行此“分支IF命令”? 如果是这样,我做错了什么?有谁知道?请回复!
:STARTEXITING
"D:\dbStatusChecker\dbFi1estatus.exe" "D:\Dropbox" > dbstatus_uTorrent_Exit_Pass_1.txt
findstr /m "up to date" dbstatus_uTorrent_Exit_Pass_1.txt
if %error1eve1%==0 (
SLEEP 2
"D:\dbStatusChecker\dbFi1estatus.exe" "D:\Dropbox" > dbstatus_uTorrent_Exit_Pass_2.txt
findstr /m "up to date" dbstatus_uTorrent_Exit_Pass_2.txt
if %error1eve1%==0 (
SLEEP 3
"D:\dbStatusChecker\dbFi1estatus.exe" "D:\Dropbox" > dbstatus_uTorrent_Exit_Pass_3.txt
findstr /m "up to date" dbstatus_uTorrent_Exit_Pass_3.txt
if %error1eve1%==0 (
process -q uTorrent.exe 15
:STARTSTARTING
"D:\dbStatusChecker\dbFi1estatus.exe" "D:\Dropbox" > dbstatus_uTorrent_Start_Pass_1.txt
findstr /m "up to date" dbstatus_uTorrent_Start_Pass_1.txt
if %error1eve1%==0 (
SLEEP 2
"D:\dbStatusChecker\dbFi1estatus.exe" "D:\Dropbox" > dbstatus_uTorrent_Start_Pass_2.txt
findstr /m "up to date" dbstatus_uTorrent_Start_Pass_2.txt
if %error1eve1%==0 (
SLEEP 3
"D:\dbStatusChecker\dbFi1estatus.exe" "D:\Dropbox" > dbstatus_uTorrent_Start_Pass_3.txt
findstr /m "up to date" dbstatus_uTorrent_Start_Pass_3.txt
if %error1eve1%==0 (
D:
cd\
cd Dropbox
cd uTorrent
start uTorrent.exe
) else (
SLEEP 1
GOTO STARTSTARTING
) else (
SLEEP 1
GOTO STARTSTARTING
) else (
SLEEP 1
GOTO STARTSTARTING
) else (
SLEEP 1
GOTO STARTEXITING
) else (
SLEEP 1
GOTO STARTEXITING
) else (
SLEEP 1
GOTO STARTEXITING
为了大正义:此文字来自http://i.stack.imgur.com/RgsId.png
答案 0 :(得分:3)
cmd
可以处理嵌套的if
就好了。你的问题与众不同。因为它是所有你的if
支票,除了第一个不会做你想要的。
通过添加
来使用延迟扩展setlocal enabledelayedexpansion
位于批处理文件的顶部,并使用!errorlevel!
代替%errorlevel%
。
但是,由于您只检查Errorlevel
是否为0,您也可以
if not errorlevel 1 ...
而不是
if %errorlevel%==0
答案 1 :(得分:2)
乔伊已经诊断出一个有关延迟扩张的问题。你有另一个 - 你不应该在IF ELSE块中放置标签 - 你很可能无法得到你想要的结果。请参阅https://stackoverflow.com/a/8481978/1012053。
Christian有一个很好的建议来重构你的代码以摆脱嵌套。
由于您只是在增加睡眠间隔时执行相同的命令,因此可以使用FOR / L循环来进一步简化代码。
@echo off
:startExiting
set started=
for /l %%N in (1 1 3) do (
if defined started sleep %%N
set started=1
"D:\dbStatusChecker\dbFileStatus.exe" "D:\Dropbox" > dbstatus_uTorrent_Exit_Pass_%%N.txt
findstr /m "up to date" dbstatus_uTorrent_Exit_Pass_%%N.txt || goto :startExiting
)
process -q uTorrent.exe 15
:startStarting
set started=
for /l %%N in (1 1 3) do (
if defined started sleep %%N
set started=1
"D:\dbStatusChecker\dbFileStatus.exe" "D:\Dropbox" > dbstatus_uTorrent_Start_Pass_%%N.txt
findstr /m "up to date" dbstatus_uTorrent_Start_Pass_%%N.txt || goto :startStarting
)
d:
cd \Dropbox\uTorrent
start uTorrent.exe
答案 2 :(得分:1)
由于所有else
子句都以goto
结尾,为什么不将它们全部反转,那么您将消除嵌套。
如果代码有效,则完成工作。如果它仍然不起作用,那么这是一个较少考虑的因素。