【问题标题】:2 nearly identical scripts, one works, one doesn't. Why? [duplicate]2 个几乎相同的脚本,一个有效,一个无效。为什么? [复制]
【发布时间】:2019-10-18 18:07:40
【问题描述】:

我正在编写一个批处理文件来自动化一个长时间运行的过程。在某些时候,脚本可能需要中断以允许人们查看和修改一些数据并解决错误,然后再从中断的地方恢复。经过一整天的故障排除后,我终于能够让它工作(似乎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 -

世界上有任何批次大师可以告诉我这里发生了什么吗?

【问题讨论】:

  • 请注意,如果您进行简单明显的更改,则不需要任何延迟扩展的东西。将其更改为If Not Exist "%STEPTRACKERFILE%" GoTo STEP1,然后您可以直接运行四行,不带括号。

标签: batch-file


【解决方案1】:

顺便说一句,这确实有效。您需要 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

【讨论】:

    猜你喜欢
    • 2011-02-11
    • 2020-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多