我制作了一个Main
批处理文件,其中包含以下行:
@echo off
color 1e
title ------ Just a Test ------
start "C:\Users\%USERNAME%\Desktop\Check.bat"
:START
echo Welcome to the Game!
...
Check.bat
包含:
@echo off
if not exist "C:\Users\%USERNAME%\Desktop\Batch_System\importantFile.dll" goto ERROR
if exist "C:\Users\%USERNAME%\Desktop\Batch_System\importantFile.dll" goto CONTINUE
:ERROR
cls
echo ERROR :
echo Important file not found. please reinstall the program
pause
exit /b
:CONTINUE
cls
exit /b
当我使用命令start
时,它只启动带有Check.bat
目录的命令提示符,主批处理文件继续执行游戏。如果importantFile.dll
不存在,我想强制关闭主批处理文件。
好的,让我解释一下:当执行主批处理文件并运行命令start
以启动另一个名为Check.bat
的批处理文件时,文件Check.bat
会检查文件{{} 1}}存在,如果不存在,importantFile.dll
会显示错误消息。
是否有人知道如何以.dll文件不存在时强制主批处理文件退出的方式编写Check.bat
?
答案 0 :(得分:0)
start
是异步的。使用start /wait
,以便main.bat
可以测试check.bat
的退出代码。让check.bat
返回适当的退出代码。
例如......
main.bat
@echo off
start /b /wait check.bat
if not %errorlevel% == 0 exit /b
echo "Welcome to the game!"
...
check.bat
@echo off
if exist "importantfile.dll" exit 0
echo ERROR: Important file not found. Please reinstall the program.
pause
exit 1
注释
将/b
添加到start
以避免打开另一个窗口。根据您的喜好进行更改。
您可以使用call
代替start
,但call
可让被调用代码访问main.bat
的变量,因此如果您使用start
,则会改进封装就像你一样。
以上简化了check.bat
中的逻辑。一旦在脚本的早期识别成功路径并退出,脚本的其余部分就可以采用失败路径。这可以为您节省一些if
和标签,您可以找到这些标签,简化了类似脚本的编写和阅读。请注意可能会在较长的脚本中混淆多个退出点!
选择退出代码时,0是成功的常用惯例。
上面的代码只是一种技术 - 还有其他一些选项(例如checksomething && dosomethingifok
)。有关返回代码和检查它们的一些有用信息可以在http://steve-jansen.github.io/guides/windows-batch-scripting/part-3-return-codes.html
答案 1 :(得分:0)
首先,通过在命令提示符窗口中运行带有/?
作为参数的命令,可以获得对每个命令的帮助。 start /?
输出命令 START 的帮助。 call /?
输出命令 CALL 的帮助,通常用于从批处理文件中运行批处理文件。这两个命令可用于运行批处理文件,详见How to call a batch file that is one level up from the current directory?
其次,命令行
start "C:\Users\%USERNAME%\Desktop\Check.bat"
在前台启动一个新的命令进程,其控制台窗口具有完全限定的批处理文件名,窗口标题显示在控制台窗口顶部的标题栏中。这显然不是你想要的。
第三,维基百科文章Windows Environment Variables列出了Windows上预定义的环境变量及其默认值,具体取决于Windows的版本。
一般情况下,最好使用"%USERPROFILE%\Desktop"
代替"C:\Users\%USERNAME%\Desktop"
。
默认情况下,Windows Vista和Windows Server 2008之前的Windows上没有C:\Users
。
用户个人资料目录可以位于与驱动器C:
不同的驱动器上。
当前用户的配置文件目录也可能不在C:\Users
中,例如在许多用户可以直接登录并且服务器管理员决定拥有用户配置文件目录的Windows服务器上在与系统驱动器不同的驱动器上,使服务器上的备份和清理操作更容易,并且更安全。
嗯,也可以让用户的桌面文件夹不在用户的个人资料目录中。但这确实非常罕见。
第四,在发送一组批处理文件时,建议使用%~dp0
从批处理文件中调用其他批处理文件,因为此字符串引用驱动器和参数0的路径扩展为当前的完整路径执行批处理文件。
以%~dp0
引用的批处理文件路径始终以反斜杠结尾。因此,在没有附加批处理文件名,文件夹或文件名的附加反斜杠的情况下连接%~dp0
。
第五,我建议您关注两个批处理文件:
<强> Main.bat:强>
@echo off
color 1e
title ------ Just a Test ------
call "%~dp0Check.bat" || color && exit /B
echo Welcome to the Game!
<强> Check.bat:强>
@echo off
cls
if exist "%~dp0Batch_System\importantFile.dll" exit /B 0
echo ERROR:
echo Important file not found. Please reinstall the program.
echo/
pause
exit /B 1
批处理文件Check.bat
将在存在的重要文件上显式退出,并返回退出代码0
到父批处理文件Main.bat
。因此,Windows命令处理器在命令行下面的命令行继续执行Main.bat
调用批处理文件Check.bat
。
否则Check.bat
输出错误消息,等待用户按下的键并以非零退出代码1
显式退出。非零退出代码导致Main.bat
执行||
之后的下一个命令( COLOR )以恢复初始颜色,然后执行退出选项/B
退出执行Main.bat
。
另见:
exit /B
就像goto :EOF
。 Main.bat
中的 CALL 命令行也可以写成:
call "%~dp0Check.bat" || ( color & exit /B )
Main.bat
也可以写成:
@echo off
color 1e
title ------ Just a Test ------
call "%~dp0Check.bat"
if errorlevel 1 (
color
goto :EOF
)
echo Welcome to the Game!
我建议不要在Main.bat
使用退出而不是exit /B
或goto :EOF
。只需 EXIT 将导致退出当前命令进程独立于调用层次结构并独立于命令进程的启动方式:使用选项/K
使其保持运行以查看错误消息,例如打开a命令提示符窗口,然后在命令提示符窗口中运行批处理文件,或者使用/C
在应用程序/命令/脚本执行完成后关闭命令进程,就像双击批处理文件一样。
建议通过在打开的命令提示符窗口中运行批处理文件来测试批处理文件,而不是双击它们以查看cmd.exe
输出的语法错误的错误消息。因此,仅使用 EXIT 会对开发中的批处理文件产生相反的效果。在命令提示符窗口中运行cmd /?
以获取有关Windows命令处理器本身的帮助。
最后但并非最不重要的是:
答案 2 :(得分:0)
感谢Mofi的回答。我有我的例子和经验。在此。简而言之,它与日志日期格式的设置有关。您可以更改时间,日期和日志的格式。您可能会得到结果。