我有两组独立的批处理命令,它们在不同的文件中独立运行。我想出了如何使用以下内容创建单个批处理文件以执行它们:
CALL %0\..\"MyBatchFile.bat"
if errorlevel 0 (
REM do some additional commands here
)
这实际上很完美,然后我只需要运行1个批处理文件来执行所有操作。但是它仍然需要2个单独的批处理文件。我想要做的是将该调用替换为外部批处理文件,并将该文件中的调用直接放在一个批处理文件中。
问题是我无法弄清楚语法基本上表现相同但只有一个文件:
在第一组语句之后执行第二组语句,仅 完成没有错误。
我尝试在语句集之间使用&&
运算符,但它没有执行这两组语句。知道如何在一个文件中包含所有语句,并且只在第一组成功完成后才执行第二组吗?
答案 0 :(得分:1)
首先,您的问题中的代码不正确。如果要调用与当前运行的脚本位于同一文件夹中的另一个脚本,则应使用%~dp0
获取驱动器和路径,并使用尾随\
,但不使用实际的脚本文件名:
call "%~dp0MyBatchFile.bat"
您可以使用"%~f0\..\MyBatchFile.bat"
,但"%~dp0MyBatchFile.bat%"
更直接,更容易理解。重要的是在整个构造中包含引号,以防路径包含空格或毒性字符。
此外,您的IF条件错误 - 如果ERRORLEVEL大于或等于0,则运行IF ERRORLEVEL 0 ...
,这几乎总是(除非您的命令返回负ERRORLEVEL)。
你想要IF %ERRORLEVEL%==0 ...
。或者您可以使用IF ERRORLEVEL 0 IF NOT ERRORLEVEL 1 ...
如果您知道您的ERRORLEVEL永远不会消极,那么您可以使用IF NOT ERRORLEVEL 1
。
有关错误检测可能性的广泛讨论,请参阅Foolproof way to check for nonzero (error) return code in windows batch file
至于你的实际问题......
我不确定我理解,但我相信您需要做的就是在脚本中调用a:标签而不是外部文件。
@echo off
call :someLabel
if %errorlevel% equ 0 (
REM do some additional commands here
)
exit /b
:someLabel
REM commands from MyBatch.bat go here
出错时EXIT / B可能更干净,而不是使用括号。
@echo off
call :someLabel
if %errorlevel% neq 0 exit /b
REM do some additional commands here
exit /b
:someLabel
REM commands from MyBatch.bat go here