2个几乎相同的脚本,一个起作用,一个不起作用。为什么?

时间:2019-10-18 18:07:40

标签: batch-file

我正在编写一个批处理文件以自动化长时间运行的过程。在某些时候,该脚本可能需要分解以允许人员查看并修改一些数据并解决错误,然后再从停下来的地方重新获取。经过一整天的故障排除后,我终于能够使它正常工作(似乎stackoverflow上的某个人已经和我有相同的想法),但是工作代码与我的几乎相同,我不明白为什么它能工作并归我没有。我很警惕在不完全了解我所做工作的情况下将此批处理文件投入生产。任何指导将不胜感激。

我已经尝试了很多事情,并最终成功了,如下所示。 SETLOCAL EnableDelayedExpansion似乎没有更改。看起来有所不同的是在IF之外调用GOTO,但这似乎并不应该是无效的。消除了文件权限之类的问题,并使用了显式目录而不是“。”在变量中。显式地调用目录,而不是使用变量……之类的东西。

这正在工作。当您在中间中断时,将按预期创建文件,并在下一次运行时正确设置该变量,然后GOTO将我们发送到正确的位置:

@echo off

echo setting variables...
set BASEDIR=.
set STEPTRACKERFILE=%BASEDIR%\LASTSUCCESSFULSTEP.TXT
echo done.

if exist %STEPTRACKERFILE% (
    echo step file found. resuming script...
    set /p STEP=<%STEPTRACKERFILE%
) else (
    set STEP=STEP1
)

GOTO %STEP%


:STEP1
echo step1
ECHO STEP2>%STEPTRACKERFILE%
pause
goto :eof

:STEP2
echo step2
ECHO STEP3>%STEPTRACKERFILE%
pause
goto :eof

:STEP3
echo step3
ECHO END>%STEPTRACKERFILE%
pause
goto :eof

:END
echo script end.
del /q %STEPTRACKERFILE%
pause
goto :eof

但是,只要文件不存在,这几乎相同的批处理就可以工作,但是如果您在中间中断并再次运行,则该变量设置为空,并且goto失败,因为它正在传递空白值:

@echo off

echo setting variables...
set BASEDIR=.
set STEPTRACKERFILE=%BASEDIR%\LASTSUCCESSFULSTEP.TXT
echo done.

if exist %STEPTRACKERFILE% (
    echo step file found. resuming script...
    set /p STEP=<%STEPTRACKERFILE%
    echo step is %STEP%
    GOTO %STEP%
)


:STEP1
echo step1
ECHO STEP2 > %STEPTRACKERFILE%
pause

:STEP2
echo step2
ECHO STEP3 > %STEPTRACKERFILE%
pause

:STEP3
echo step3
ECHO END > %STEPTRACKERFILE%
pause

:END
echo script end.
del /q %STEPTRACKERFILE%
pause

错误消息仅说明以下内容:

step file found. resuming script...
step is
The system cannot find the batch label specified -

世界上剩下的任何一批大师都可以告诉我这里发生了什么事

1 个答案:

答案 0 :(得分:0)

这确实起作用。您需要Setlocal EnableDelayedExpansion以及使用!s而不是%s。可以找到原因here

@echo off
Setlocal EnableDelayedExpansion
echo setting variables...
set BASEDIR=.
set STEPTRACKERFILE=%BASEDIR%\LASTSUCCESSFULSTEP.TXT
echo done.

if exist %STEPTRACKERFILE% (
    echo step file found. resuming script...
    set /p STEP=<%STEPTRACKERFILE%
    echo step is !STEP!
    GOTO !STEP!
)

:STEP1
echo step1
ECHO STEP2 > %STEPTRACKERFILE%
pause

:STEP2
echo step2
ECHO STEP3 > %STEPTRACKERFILE%
pause

:STEP3
echo step3
ECHO END > %STEPTRACKERFILE%
pause

:END
echo script end.
del /q %STEPTRACKERFILE%
pause