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



我用下面的行创建了一个Main批处理文件:

@echo off
color 1e
title  ------ Just a Test ------
start "C:Users%USERNAME%DesktopCheck.bat"
:START
echo Welcome to the Game!
...

Check.bat包含:

@echo off
if not exist "C:Users%USERNAME%DesktopBatch_SystemimportantFile.dll" goto ERROR
if exist "C:Users%USERNAME%DesktopBatch_SystemimportantFile.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显示错误消息。

有谁知道如何以当.dll文件不存在时强制主批处理文件退出的方式编写Check.bat

首先,可以通过在命令提示符窗口中运行以/?作为参数的命令来获取每个命令的帮助。start /?输出命令START的帮助。call /?输出命令CALL的帮助,通常用于从批处理文件中运行批处理文件。这两个命令可用于运行批处理文件,如如何调用比当前目录高一级的批处理文件?


二、命令行

start "C:Users%USERNAME%DesktopCheck.bat"

使用控制台窗口在前台启动新的命令进程,该控制台窗口的窗口标题显示为控制台窗口顶部标题栏中的完整限定批处理文件名。这显然不是你想要的。


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

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

默认情况下,Windows 在 WindowsVista 和 Windows Server 2008 之前根本没有C:Users

用户配置文件目录可以位于与驱动器C:不同的驱动器上。

也有可能只有当前用户的配置文件目录不在C:Users,例如在许多用户可以直接登录的Windows服务器上,并且服务器管理员决定将用户的配置文件目录放在与系统驱动器不同的驱动器上,使服务器上的备份和清理操作更容易,并且安全性也更好。

好吧,也可以让用户的桌面文件夹不在用户的配置文件目录中。但这真的非常非常罕见。


第四,在传送一组批处理文件时,建议使用%~dp0从批处理文件中调用其他批处理文件,因为此字符串引用驱动器,参数 0 的路径扩展到当前执行的批处理文件的完整路径。

使用%~dp0引用的批处理文件路径始终以反斜杠结尾。因此,%~dp0始终连接,不要使用额外的反斜杠与另一个批处理文件名、文件夹或文件名连接。

参见 使用%~dp0引用的批处理文件路径有时在更改目录时更改的原因是什么?


第五,我建议对你的两个批处理文件进行以下操作:

主.bat:

@echo off
color 1e
title  ------ Just a Test ------
call "%~dp0Check.bat" || color && exit /B
echo Welcome to the Game!

检查.bat:

@echo off
cls
if exist "%~dp0Batch_SystemimportantFile.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 命令处理器继续在调用批处理文件Check.bat的命令行下方的命令行上执行Main.bat

否则,Check.bat输出错误消息,等待用户按下的键,并使用非零退出代码显式退出1。非零退出代码导致Main.bat执行||之后的下一个命令,该命令是COLOR以恢复初始颜色,下一次执行也使用 EXIT选项/B退出执行Main.bat

另请参阅:

  • 使用Windows批处理文件的具有多个命令的单行
  • 内部 cmd.exe 命令设置的错误级别值是什么?
  • 哪个 cmd.exe 内部命令在成功时将错误级别清除为 0?
  • GOTO :EOF 回到哪里?
    没有额外指定的退出代码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 /Bgoto :EOF.只需EXIT将导致退出当前命令进程,独立于调用层次结构,也独立于命令进程的启动方式:使用选项/K使其保持运行以查看错误消息,例如打开命令提示符窗口和下次从命令提示符窗口中运行批处理文件,或者/C在应用程序/命令/脚本执行完成后关闭命令进程,例如双击批处理文件。

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

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

  • Microsoft的命令行参考
  • SS64.com - Windows CMD命令行的A-Z索引

默认情况下start是异步的。使用start /wait以便main.bat可以测试check.bat的退出代码。使check.bat返回适当的退出代码。

例如。。。

主.bat

@echo off
start /b /wait check.bat
if not %errorlevel% == 0 exit /b
echo "Welcome to the game!"
...

检查.bat

@echo off
if exist "importantfile.dll" exit 0
echo ERROR: Important file not found. Please reinstall the program.
pause
exit 1

笔记

start中添加了/b以避免打开另一个窗口。根据您的喜好进行更改。

您可以使用call而不是startcall允许被调用的代码访问main.bat变量,因此如果您像以前一样使用start,则可以改善封装。

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

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

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

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

为什么批处理文件运行与失败在 Windows 服务器中

相关内容

  • 没有找到相关文章

最新更新