有没有调用external.bat文件的条件块?

时间:2015-03-25 21:20:20

标签: batch-file

我有两组独立的批处理命令,它们在不同的文件中独立运行。我想出了如何使用以下内容创建单个批处理文件以执行它们:

CALL %0\..\"MyBatchFile.bat"

if errorlevel 0 ( 
    REM do some additional commands here
)

这实际上很完美,然后我只需要运行1个批处理文件来执行所有操作。但是它仍然需要2个单独的批处理文件。我想要做的是将该调用替换为外部批处理文件,并将该文件中的调用直接放在一个批处理文件中。

问题是我无法弄清楚语法基本上表现相同但只有一个文件:

  

在第一组语句之后执行第二组语句,   完成没有错误。

我尝试在语句集之间使用&&运算符,但它没有执行这两组语句。知道如何在一个文件中包含所有语句,并且只在第一组成功完成后才执行第二组吗?

1 个答案:

答案 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