为什么批处理文件中使用的命令START不能启动批处理文件?

时间:2018-06-01 21:08:59

标签: batch-file command exit file-exists

我制作了一个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

3 个答案:

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

另见What is the reason for batch file path referenced with %~dp0 sometimes changes on changing directory?

第五,我建议您关注两个批处理文件:

<强> 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

另见:

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 /Bgoto :EOF。只需 EXIT 将导致退出当前命令进程独立于调用层次结构并独立于命令进程的启动方式:使用选项/K使其保持运行以查看错误消息,例如打开a命令提示符窗口,然后在命令提示符窗口中运行批处理文件,或者使用/C在应用程序/命令/脚本执行完成后关闭命令进程,就像双击批处理文件一样。

建议通过在打开的命令提示符窗口中运行批处理文件来测试批处理文件,而不是双击它们以查看cmd.exe输出的语法错误的错误消息。因此,仅使用 EXIT 会对开发中的批处理文件产生相反的效果。在命令提示符窗口中运行cmd /?以获取有关Windows命令处理器本身的帮助。

最后但并非最不重要的是:

答案 2 :(得分:0)

感谢Mofi的回答。我有我的例子和经验。在此。简而言之,它与日志日期格式的设置有关。您可以更改时间,日期和日志的格式。您可能会得到结果。

why-batch-file-run-with-failure-in-windows-server