代码之家  ›  专栏  ›  技术社区  ›  Sheep1Man

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

  •  2
  • Sheep1Man  · 技术社区  · 7 年前

    我犯了一个错误 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 ,它只会以 检查球棒 目录和主批处理文件继续执行游戏。我想强制关闭主批处理文件,如果 importantFile.dll 根本不存在。

    好的,让我解释一下:当执行主批处理文件并运行命令时 开始 启动另一个名为 检查球棒 ,文件 检查球棒 检查文件是否 重要文件。动态链接库 存在,如果不存在, 检查球棒 显示一条错误消息。

    有人会写字吗 检查球棒 以一种当。dll文件不存在,是否强制退出主批处理文件?

    3 回复  |  直到 7 年前
        1
  •  1
  •   Mofi    7 年前

    首先,通过在命令提示符窗口中运行命令,可以获得每个命令的帮助 /? 作为参数。 start /? 在命令的帮助下输出 开始 . call /? 在命令的帮助下输出 呼叫 通常用于从批处理文件中运行批处理文件。这两个命令可用于运行批处理文件,如上的answer中详细解释的 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" .

    没有 C:\Users 默认情况下,在Windows Vista和Windows Server 2008之前的Windows上。

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

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

    当然,用户的桌面文件夹也可能不在用户的配置文件目录中。但这真的很少见。


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

    引用的批处理文件路径 %~dp0 总是以反斜杠结尾。因此连接 %~dp0 始终不使用其他批处理文件名、文件夹或文件名的附加反斜杠。

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


    第五,我建议您的两个批处理文件如下:

    主要的蝙蝠:

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

    检查蝙蝠:

    @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命令处理器继续执行 主要的球棒 在命令行下方的命令行上 使命感 批处理文件 检查球棒 .

    否则 检查球棒 输出错误消息,等待用户按键,并以非零退出代码显式退出 1 .非零退出代码会导致 主要的球棒 在执行下一个命令之后 || 这就是 颜色 恢复初始颜色和下一步 出口 有选择权 /B 退出执行 主要的球棒 .

    另见:

    这个 呼叫 命令行输入 主要的球棒 也可以写成:

    call "%~dp0Check.bat" || ( color & exit /B )
    

    主要的球棒 也可以写成:

    @echo off
    color 1e
    title  ------ Just a Test ------
    call "%~dp0Check.bat"
    if errorlevel 1 (
        color
        goto :EOF
    )
    echo Welcome to the Game!
    

    我不建议在任何情况下使用 主要的球棒 只是 出口 而不是 退出/B 后藤:EOF 只是 出口 将导致退出当前命令进程,而不依赖于调用层次结构和命令进程的启动方式:with option /K 要使其保持运行,请查看错误消息,如打开命令提示符窗口,然后从命令提示符窗口中运行批处理文件,或使用 /C 在应用程序/命令/脚本执行完成后关闭命令进程,就像双击批处理文件一样。

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

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

        2
  •  0
  •   simaos    7 年前

    start 默认情况下是异步的。使用 start /wait 因此 main.bat 可以测试 check.bat 制作 检查球棒 返回相应的退出代码。

    例如

    主要的球棒

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

    检查球棒

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

    笔记

    补充 /b 开始 避免打开另一扇窗户。根据你的喜好改变。

    你可以用 call 而不是 开始 但是 呼叫 使被调用的代码能够访问 主要的球棒 因此,如果使用 开始 和你一样。

    中的逻辑 检查球棒 以上是简化的。一旦在脚本的早期确定了成功路径并退出,脚本的其余部分就可以采用失败路径。这会帮你省下一些钱 if 您可能会发现,它简化了类似脚本的编写和阅读。不过,请注意,在较长的脚本中,可能会混淆多个退出点!

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

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

        3
  •  0
  •   Dulaj Kulathunga    5 年前

    多亏了外交部的回答。我有我的例子和经验。简而言之,这是关于日志日期格式的设置。您可以更改时间、日期和日志的格式。你可能会有结果。

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

    推荐文章