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

Why does command START used in a batch file not start a batch file?

我用下面的行创建了一个 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 检查文件是否importantFile.dll 存在,如果不存在,Check.bat 显示一条错误消息。

有谁知道如何写Check.bat当.dll文件不存在时,强制主批处理文件退出?

start默认是异步的。使用 start /wait 以便 main.bat 可以测试 check.bat 的退出代码。使 check.bat return 成为适当的退出代码。

例如...

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 以避免打开另一个 window。根据您的喜好进行更改。

您可以使用 call 而不是 start,但是 call 使被调用的代码可以访问 main.bat 的变量,因此如果您使用 [=12] 可以改进封装=] 和你一样。

check.bat中的逻辑在上面进行了简化。一旦您在脚本的早期确定了成功路径并退出,脚本的其余部分就可以采用失败路径。这为您节省了一些 if 和标签,您可能会发现它们简化了类似脚本的编写和阅读。不过,请注意较长脚本中可能会混淆多个出口点!

选择退出代码时,0 是成功的常见约定。

以上代码只是一种技术——还有其他几种选择(例如checksomething && dosomethingifok)。关于 return 代码的一些有用信息,以及检查它们,可以在 http://steve-jansen.github.io/guides/windows-batch-scripting/part-3-return-codes.html

中找到

首先,每个命令的帮助都可以通过在命令提示符 window 中 运行 以 /? 作为参数的命令获得。 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"

使用控制台 window 在前台启动一个新的命令进程,完整的批处理文件名称为 window 标题显示在控制台 window 顶部的标题栏中。那显然不是你想要的。


第三,维基百科文章 Windows Environment Variables 列出了 Windows 上的预定义环境变量及其默认值,具体取决于 Windows.

的版本

一般来说,最好使用"%USERPROFILE%\Desktop"而不是"C:\Users\%USERNAME%\Desktop"

在 Windows 之前的 Windows Vista 和 Windows Server 2008 默认情况下根本没有 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 到 parent 批处理文件 Main.bat。因此,Windows 命令处理器继续执行 Main.bat 在命令行下方的命令行 调用 批处理文件 Check.bat.

否则 Check.bat 输出一条错误消息,等待用户按下键并以非零退出代码 1 显式退出。非零退出代码导致 Main.bat|| 之后执行下一个命令,即 COLOR 以恢复初始颜色,下一个执行也 EXIT 使用选项 /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 而不是 exit /Bgoto :EOF。仅 EXIT 将导致退出当前命令进程,与调用层次结构无关,也与命令进程的启动方式无关:使用选项 /K 保留它 运行 参见错误消息,例如打开命令提示符 window 和下一个 运行 从命令提示符 window 中打开批处理文件,或者使用 /C 在 [=146] 之后关闭命令进程=] 执行完成,就像双击批处理文件一样。

建议通过 运行 在打开的命令提示符 window 中测试批处理文件,而不是双击它们来查看 [=46= 输出的有关语法错误的错误消息].出于这个原因,EXIT 的用法对于开发中的批处理文件来说是 counter-productive。 运行 cmd /? 在命令提示符 window 中寻求有关 Windows 命令处理器本身的帮助。

最后但同样重要的是:

感谢Mofi的解答。我有我的例子和实验。对此。简而言之,就是关于日志日期格式的设置。您可以更改时间、日期和日志的格式。你可能会有结果。

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