我正在编写用于部署asp.net解决方案的第一个批处理文件.我一直在谷歌搜索一般的错误处理方法,找不到任何真正有用的东西.
基本上如果出现任何问题我想停下来打印出错的地方.
任何人都可以给我任何指示吗?
我的批处理文件有问题.它通过这样的方式自动构建几个程序:
所以它看起来像这样:
set FLAG=1
...
gmake all
call :interactive_check
set OTHERFLAG=1
...
gmake all
call :interactive_check
Run Code Online (Sandbox Code Playgroud)
其中有6或7个(它可能会增长).所以我创建了一个函数来检查errorlevel而不是在每一步复制/粘贴它.问题是:错误检查是通过一个函数完成的:
:interactive_check
if errorlevel 1 (
echo.
echo /!\/!\/!\/!\/!\/!\/!\/!\/!\/!\/!\/!\/!\
echo Error in compilation process... exiting
echo /!\/!\/!\/!\/!\/!\/!\/!\/!\/!\/!\/!\/!\
echo.
cd %root_dir%
exit /B 1
) ELSE (
echo.Continuing to next step
)
goto:eof
Run Code Online (Sandbox Code Playgroud)
现在,在运行它时,exit /B 1只需退出函数,但不退出批处理文件.
你是否知道如何退出整个批处理文件而不必在每一步复制/粘贴我的"if errorlevel 1 .."?
我有一个简单的函数来检查目录:
:direxist
if not exist %~1 (
echo %~1 could not be found, check to make sure your location is correct.
goto:end
) else (
echo %~1 is a real directory
goto:eof
)
Run Code Online (Sandbox Code Playgroud)
:结束写成
:end
endlocal
Run Code Online (Sandbox Code Playgroud)
我不明白为什么程序不会在goto:end被调用后停止.我有另一个函数使用相同的方法来停止程序,它工作正常.
:PRINT_USAGE
echo Usage:
echo ------
echo <file usage information>
goto:end
Run Code Online (Sandbox Code Playgroud)
在这种情况下,程序在调用后停止:end; 为什么这不起作用:direxist?谢谢您的帮助!
我们有一堆.bat构建脚本,这些脚本由基于 PowerShell 的 GitLab 运行器调用,这些运行器最近重构为:
program args
if !errorlevel! neq 0 exit /b !errorlevel!
Run Code Online (Sandbox Code Playgroud)
更简洁:
program args || exit /b
Run Code Online (Sandbox Code Playgroud)
今天我调查了一个构建作业,如果您查看错误日志,该作业显然失败了,但报告为成功。经过大量实验,我发现这种模式并不总是按预期工作:
program args || exit /b
Run Code Online (Sandbox Code Playgroud)
但是当前者没有时,这似乎确实有效:
program args || exit /b !errorlevel!
Run Code Online (Sandbox Code Playgroud)
我已经阅读了 SO question Windows batch exit option b with or without errorlevel和下面来自https://www.robvanderwoude.com/exit.php的声明,但仍然不能完全解释我正在观察的内容。
DOS 联机帮助 (HELP EXIT) 没有明确说明 /B 参数退出当前脚本实例不一定与退出当前脚本相同。即,如果脚本在 CALLed 代码段中,则 EXIT /B 退出 CALL,而不是脚本。
这是我用来探索这个的最小批处理文件:
@echo off
setlocal EnableDelayedExpansion
cmd /c "exit 99" || exit /b
:: cmd /c …Run Code Online (Sandbox Code Playgroud) Windows .bat脚本是否具有类似于退出陷阱的功能,这将允许注册始终需要运行的清理操作?
我对使用Powershell或其他shell的任何解决方案都不感兴趣(我已经在目标系统上安装了Python,所以如果在批处理文件中无法完成,我将在try中将一堆调用包装到subprocess.Popen中. ..最后).