Windows 批处理文件,检查是否返回错误,然后执行操作?

Windows 批处理文件,检查是否返回错误,然后执行操作?,windows,batch-file,Windows,Batch File,对于批处理文件,我正在尝试运行命令,如果命令返回错误,请尝试对每个命令使用GOTO执行其他命令…但是脚本不断失败并出现错误…但现在不应该这样做,至少如果最后一个GOTO不起作用,它应该进入一个无休止的循环 我读到检查是否有错误是这样的 IF %ERRORLEVEL% NEQ 0 ( GOTO tryInRoot ) 但我不太确定,有什么帮助吗 grunt precommit IF %ERRORLEVEL% NEQ 0 ( GOTO tryInRoot ) :tryInRoot

对于批处理文件,我正在尝试运行命令,如果命令返回错误,请尝试对每个命令使用GOTO执行其他命令…但是脚本不断失败并出现错误…但现在不应该这样做,至少如果最后一个GOTO不起作用,它应该进入一个无休止的循环

我读到检查是否有错误是这样的

IF %ERRORLEVEL% NEQ 0 (
    GOTO tryInRoot
)
但我不太确定,有什么帮助吗

grunt precommit
IF %ERRORLEVEL% NEQ 0 (
    GOTO tryInRoot
)

:tryInRoot
    cd mow\client && grunt precommit
    IF %ERRORLEVEL% NEQ 0 (
        GOTO tryInTrunk
    )

:tryInTrunk
    cd client && grunt precommit
        IF %ERRORLEVEL% NEQ 0 (
        GOTO whenInMapManager
    )

:whenInMapManager
    cd ..
    IF EXIST "Gruntfile.js" (
        GOTO leavingMapManager
    ) ELSE (
        GOTO whenInMapManager
    )
:leavingMapManager
    cd ..
    cd mow\client && grunt precommit

使用
|
是一个更好的选择

但是,GOTO有一个独特的情况,它将中断
| |
,因此您需要在此之前添加调用


调用grunt-precommit | | | cd-mow\client&&grunt-precommit | | cd-client&&grunt-precommit | | |转到whenInMapManager

您的逻辑没有多大意义。即使errorlevel为零,它仍将运行:tryInRoot和:tryIntrunk和:whenInMapManager。如果errorlevel为零,您需要逻辑让它跳过该代码。@Squashman啊,那么这只是简单地为这些情况添加ELSE块以退出
exit\b
请注意,许多命令都已设置,但不会重置它们,因此,即使您已按照建议更正了逻辑(例如,通过添加
else goto:where
),在出现第一个异常时,
ErrorLevel
可能仍然是非零值。作为
if%ErrorLevel%
查询的替代方法,您也可以使用,它检查前面命令的退出代码…我从这开始,但如果前三个失败,我需要添加一个GOTO,以循环cd,直到某个点…基本上
grunt-precommit | | | cd-mow\client和&grunt-precommit | | cd-client和&grunt-precommit | | | GOTO whenimapmanager
所以我猜使用条件执行运算符对GOTO不起作用,或者我的逻辑在其他地方是错误的?在上述情况下应该使用括号,例如
grunt-precommit |(cd-mow\client和grunt-precommit)|(cd客户端和grunt预调试)| |转到whenInMapManager
。注意,您将在
\mow\client\client
中运行最后一次预编译