【问题标题】:How can I debug a .BAT script?如何调试 .BAT 脚本?
【发布时间】:2010-09-15 00:31:32
【问题描述】:

有没有办法单步执行 .bat 脚本?问题是,我有一个构建脚本,它调用了很多其他脚本,我想看看它们被调用的顺序是什么,这样我就可以知道我必须去哪里并添加我的修改.

【问题讨论】:

标签: windows batch-file debugging cmd dos


【解决方案1】:

我不知道如何逐步执行 .bat 文件,但您可以使用 echopause 来帮助调试。

回声
将在批处理文件中回显一条消息。比如ECHO Hello World 执行时会在屏幕上打印Hello World。但是,如果在批处理文件的开头没有 @ECHO OFF,您还将获得“ECHO Hello World”和“Hello World”。最后,如果您只想创建一个空行,请键入 ECHO。在末尾添加句点会创建一个空行。

暂停
提示用户按任意键继续。

来源:Batch File Help

@workmad3:答案有更多关于使用echo 命令的好技巧。

另一个有用的资源...DDB: DOS Batch File Tips

【讨论】:

  • 我想这些是我唯一的选择。
【解决方案2】:

确保脚本中没有“echo off”语句,并在调用每个脚本后调用“echo on”以重置您错过的任何内容。

原因是如果echo保持打开,那么命令解释器将在执行之前输出每个命令(在参数处理之后)。让它看起来很不适合在生产环境中使用,但对于调试目的非常有用,因为您可以看到输出出错的地方。

另外,请确保您正在检查由调用的批处理脚本和程序设置的错误级别。请记住,.bat 文件中为此使用了 2 种不同的方法。如果调用程序,错误级别在 %ERRORLEVEL% 中,而从批处理文件中,错误级别在 ErrorLevel 变量中返回,不需要在其周围加上 %。

【讨论】:

    【解决方案3】:

    面对类似的担忧,我通过简单的 Google 搜索找到了以下工具:

    JPSoft 的“Take Command”包含一个批处理文件 IDE/调试器。他们的short presentation video 很好地展示了这一点。

    我使用试用版已经有几个小时了。这是我的第一个拙见:

    • 一方面,它确实允许调试 .bat 和 .cmd 脚本,我现在确信它在某些情况下会有所帮助
    • 另一方面,它有时会阻塞,我不得不杀死它...特别是在调试下标时(并非总是系统地)...它没有显示“调用堆栈”或“退出”按钮。

    试一试。

    【讨论】:

    • 这应该是个评论
    • @KyleMit 你能解释一下为什么吗?因为这是一个与其他解决方案不同的独立解决方案,并且确实回答了原始问题?这不是因为它足够短以适合评论,它必须..
    • 我的意思确实是可能,因为它可以是任何一种方式。但这是一种lmgtfy 的答案。来自help center answer 部分:Always quote the most relevant part of an important link。如果没有链接,这个答案就会消失,这可能也很好,但通常这种未经测试的专有软件的临时建议通常最适合评论。也可以随意离开。
    【解决方案4】:

    我发现“运行步骤”(win32) 软件完全符合我的要求: http://www.steppingsoftware.com/

    您可以在查看输出和环境变量的同时加载一个 bat 文件、放置断点/开始单步执行。

    评估版只允许单步执行 50 行...有没有人有类似功能的免费替代品?

    【讨论】:

    【解决方案5】:

    移除@ECHO OFF 并调用您的批处理文件将所有输出重定向到日志文件..

    c:> yourbatch.bat(可选参数)> yourlogfile.txt 2>&1

    发现于http://www.robvanderwoude.com/battech_debugging.php

    它工作!不要忘记 2>&1...

    WIZ

    【讨论】:

      【解决方案6】:

      我能想到的唯一方法是在代码中添加echos 和pauses。

      【讨论】:

        【解决方案7】:

        您是否尝试将结果重新路由到文件?喜欢whatever.bat >log.txt

        您必须确保在这种情况下,所有其他调用的脚本也都记录到文件中,例如 >>log.txt

        此外,如果您在该批处理文件的开头和结尾放置日期 /T 和时间 /T,您将获得当时的时间,并且您可以映射脚本运行时间和顺序。

        【讨论】:

        • 将结果写入文件并没有多大帮助,有很多脚本会被调用,还有很多可执行文件会被执行。
        • 如果所有其他脚本和程序都写入标准输入,那么它们的所有消息也会被记录下来。如果您只是执行批处理并且看到很多消息正在运行,那么您可以将它们重定向到日志文件。
        【解决方案8】:

        您可以在脚本末尾使用cmd \k 来查看错误。执行完成后它不会关闭你的命令提示符

        【讨论】:

        • 其实是cmd /K。无论如何,pause 有什么问题?
        【解决方案9】:

        或者.... 从另一个 .bat 文件调用您的主 .bat 文件并将结果输出到结果文件,即

        runner.bat > mainresults.txt

        runner.bat 调用主 .bat 文件的地方

        您现在应该可以看到在主 .bat 文件中执行的所有操作

        【讨论】:

          【解决方案10】:

          一个非常常见的问题是批处理脚本通过双击其图标来运行。由于托管命令提示符 (cmd.exe) 实例也会在批处理脚本完成后立即终止,因此无法读取潜在的输出和错误消息。

          要阅读此类消息,显式打开命令提示符窗口,移动到适用的工作目录并通过键入其路径/名称来运行批处理脚本非常重要。

          【讨论】:

            【解决方案11】:

            或者,打开一个 cmd 窗口,然后从那里调用批处理,输出将显示在屏幕上。

            【讨论】:

            • 这做出了如此多的错误假设,甚至都不是答案。可能最大的两个是a)假设批处理文件产生控制台输出。不必这样做,并且 b) 批处理文件实际上正在工作
            • @Leliel, ad a) 是的,批处理文件可能会也可能不会产生控制台输出,但是当你双击它的图标时你不会发现,但是从cmd.exe 运行它时会以防万一; ad b) 你的声明是错误的,批处理文件不必工作,甚至可能出现致命的语法错误,这通常会生成控制台错误消息……
            猜你喜欢
            • 1970-01-01
            • 2017-08-22
            • 2015-07-23
            • 2021-04-05
            • 2017-08-24
            • 2014-05-14
            • 2011-01-08
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多