如何调试 .BAT 脚本?

112

有没有一种方式可以逐步执行 .bat 脚本?问题是,我有一个构建脚本,它调用了许多其他脚本,我想知道它们被调用的顺序,以便我知道在哪里添加我的修改。


4dos内置调试器。 - user459513
11个回答

81

我不知道任何一种方法可以逐步执行.bat文件,但您可以使用echopause帮助调试。

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

PAUSE
提示用户按任意键继续。

来源:批处理文件帮助

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

另一个有用的资源... DDB: DOS批处理文件技巧


20

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

原因是如果开启了echo,那么命令解释器将在执行每个命令(参数处理后)之前输出它。 这使得在生产中使用看起来非常不好,但在调试目的下非常有用,因为可以看到输出出了什么问题。

此外,请确保检查所调用的批处理脚本和程序设置的错误级别(ErrorLevels)。 请记住,在.bat文件中有两种不同的方法用于此。 如果调用了一个程序,则Error level在%ERRORLEVEL%中,而从批处理文件中返回的错误级别存储在ErrorLevel变量中,不需要用%号括起来。


16

面对类似的问题,我在简单的谷歌搜索中找到了以下工具:

JPSoft的"Take Command"包含了一个批处理文件IDE/调试器。他们的短视频演示得非常好。

我使用试用版已有几个小时。这是我的第一个简单意见:

  • 一方面,它确实允许调试.bat和.cmd脚本,我现在相信它可以在很多情况下提供帮助。
  • 另一方面,它有时会阻塞,我不得不关闭它...特别是在调试子脚本时(并非总是如此)...它没有显示"调用栈"或"步出"按钮。

它值得一试。


1
这可能应该是一条注释。 - KyleMit
11
@KyleMit,请问您能解释一下为什么吗?因为这是一个独立的解决方案,不同于其他的回答并且回答了原始问题。虽然它足够简短以适应评论,但也并不意味着必须使用评论。 - Myobis
1
我实际上是指“可能”,因为它可以两种方式进行。但这有点像lmgtfy的回答。根据帮助中心答案部分:始终引用重要链接的最相关部分。没有链接,这个答案就会消失,这也可能没关系,但通常这种未经测试的专有软件的即兴建议最好适合于评论。你也可以留下它。 - KyleMit

9
我发现“running steps”(win32)软件正好符合我的要求:http://www.steppingsoftware.com/ 您可以加载一个bat文件,在查看输出和环境变量的同时,设置断点/开始逐步执行。
评估版本只允许执行50行...是否有类似功能的免费替代品?

9
他们失去了那个域名,可能已经停业。你仍然可以从https://web.archive.org/web/20120421211043/http://www.steppingsoftware.com/ssportal/Downloads/tabid/58/Default.aspx下载评估软件,但不能再购买许可证。 - twasbrillig

8

3

你尝试过将结果重定向到文件吗?比如将 whatever.bat >log.txt。

在这种情况下,你需要确保每个被调用的脚本都像 >>log.txt 一样记录日志到文件中。

另外,如果你在批处理文件开头和结尾加上日期 /T 和时间 /T,你可以得到脚本运行时的时间和顺序,从而确定脚本的运行时间和顺序。


将结果写入文件并不能帮助太多,因为有许多脚本被调用,还有许多可执行文件被执行。 - Vhaerun
1
如果所有其他脚本和程序都写入stdin,那么它们的所有消息也会被记录下来。如果你只是执行批处理,并看到很多消息正在运行中,那么你可以将它们重定向到一个日志文件。 - Biri

2
我能想到的唯一办法是在代码中加入 echopause 的语句。

2

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


3
实际上是 cmd /K。无论如何,pause有什么问题吗? - aschipfl

2
一个非常常见的问题是通过双击批处理脚本图标来运行它。由于主机命令提示符 (cmd.exe) 实例在批处理脚本完成后也会终止,因此无法读取可能存在的输出和错误消息。
为了读取这些消息,非常重要的是要显式地打开一个命令提示符窗口,移动到适当的工作目录并通过键入其路径/名称来运行批处理脚本。

1
或者...... 从另一个 .bat 文件中调用您的主 .bat 文件,并将结果输出到结果文件,例如:
runner.bat > mainresults.txt
其中 runner.bat 调用主 .bat 文件
现在您应该可以看到主 .bat 文件中执行的所有操作了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接