为什么批处理文件中使用的命令 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
与另一个批处理文件名、文件夹或文件名连接起来,而不使用额外的反斜杠。
第五,我建议您的两个批处理文件如下:
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
的执行。
另请参阅:
- Single line with multiple commands using Windows batch file
- What are the ERRORLEVEL values set by internal cmd.exe commands?
- Which cmd.exe internal commands clear the ERRORLEVEL to 0 upon success?
- Where does GOTO :EOF return to?
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 而不是 exit /B
或 goto :EOF
。仅 EXIT 将导致退出当前命令进程,与调用层次结构无关,也与命令进程的启动方式无关:使用选项 /K
保留它 运行 参见错误消息,例如打开命令提示符 window 和下一个 运行 从命令提示符 window 中打开批处理文件,或者使用 /C
在 [=146] 之后关闭命令进程=] 执行完成,就像双击批处理文件一样。
建议通过 运行 在打开的命令提示符 window 中测试批处理文件,而不是双击它们来查看 [=46= 输出的有关语法错误的错误消息].出于这个原因,EXIT 的用法对于开发中的批处理文件来说是 counter-productive。 运行 cmd /?
在命令提示符 window 中寻求有关 Windows 命令处理器本身的帮助。
最后但同样重要的是:
感谢Mofi的解答。我有我的例子和实验。对此。简而言之,就是关于日志日期格式的设置。您可以更改时间、日期和日志的格式。你可能会有结果。
我用下面的行创建了一个 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
与另一个批处理文件名、文件夹或文件名连接起来,而不使用额外的反斜杠。
第五,我建议您的两个批处理文件如下:
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
的执行。
另请参阅:
- Single line with multiple commands using Windows batch file
- What are the ERRORLEVEL values set by internal cmd.exe commands?
- Which cmd.exe internal commands clear the ERRORLEVEL to 0 upon success?
- Where does GOTO :EOF return to?
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 而不是 exit /B
或 goto :EOF
。仅 EXIT 将导致退出当前命令进程,与调用层次结构无关,也与命令进程的启动方式无关:使用选项 /K
保留它 运行 参见错误消息,例如打开命令提示符 window 和下一个 运行 从命令提示符 window 中打开批处理文件,或者使用 /C
在 [=146] 之后关闭命令进程=] 执行完成,就像双击批处理文件一样。
建议通过 运行 在打开的命令提示符 window 中测试批处理文件,而不是双击它们来查看 [=46= 输出的有关语法错误的错误消息].出于这个原因,EXIT 的用法对于开发中的批处理文件来说是 counter-productive。 运行 cmd /?
在命令提示符 window 中寻求有关 Windows 命令处理器本身的帮助。
最后但同样重要的是:
感谢Mofi的解答。我有我的例子和实验。对此。简而言之,就是关于日志日期格式的设置。您可以更改时间、日期和日志的格式。你可能会有结果。