【问题标题】:Is there any way to trace through the execution of a batch file?有没有办法跟踪批处理文件的执行?
【发布时间】:2010-03-02 19:54:23
【问题描述】:

我继承了一些大型批处理文件,我想将它们重写为更“开发人员友好”的语言。

我想了解以下几点:

  • 它调用了哪些其他脚本
  • 它启动了哪些其他进程
  • 它会写入哪些文件
  • 它使用什么环境变量,设置了哪些环境变量

最后一点,我知道在开始之前我可以做到这一点:

set > original_environment.txt

在我运行它之后,我可以这样做:

set > new_environment.txt

并且只是在它们之间做一个差异......但我可能会错过一些在脚本完成时可能未设置的变量(或者如果脚本在 setlocal 下运行,甚至是所有变量)。

有没有什么方法可以找到所有这些东西,而无需我在整个脚本代码中添加大量的 echo 语句? 有没有这样的工具可以监控批处理文件启动的进程并告诉我它所做的一切?

【问题讨论】:

  • 在 PowerShell 中重写它们。它具有调试功能。您还可以使用 Idera 出色的“PowerShell Plus”产品,获得交互式调试体验。
  • @John:我认为 OP 的问题是更了解批处理文件如何用另一种语言重写它。所以你有点再次提出同样的观点:)
  • 您可以从 Process Monitor technet.microsoft.com/en-us/sysinternals/bb896645.aspx 获得其中的一些信息,但至于其他信息。我希望你能找到一些东西,但我并不乐观。
  • 我了解批处理的作用,如果我通读它,我可以重现它,但我正在考虑一个工具,它可以尽可能多地报告这些事情。

标签: winapi refactoring batch-file environment


【解决方案1】:

您只需查看它们的内部并弄清楚它们的作用。

您还可以删除任何echo off 语句和@ 前面的命令;这样,每个命令在运行之前都会输出,您可以将输出重定向到文件以供以后研究。

据我所知,没有针对批处理文件的调试工具,但我打算编写一次。

【讨论】:

  • 是的,但我必须确保所有其他被调用的脚本也没有echo off。我正在考虑关于该工具的相同事情:)
  • @Geo:这种工具的问题在于您必须准确地模拟 cmd 的行为。而且您不能只在 cmd 中逐行执行,因为这通常与从批处理文件运行时的结果不同——一种天真的方法可能会失败。虽然我认为我有一个可以工作的想法——你只需写出另一个批处理文件,在每行之后包含一个pause 语句,并将完整的环境写入一个文件以供调试器抓取.可能不太漂亮,跟踪打开的文件完全是另一个问题。不过,进程监视器是一个不错的提示
【解决方案2】:

没有直接的方法可以做到这一点。但创建一个也不是不可能的。

自从 Windows XP/Vista/7 出来之后,good'ole 的 DOS 批处理命令集得到了很大的升级,虽然没有多少人使用它们甚至 RTFM (FOR /??)

所以我在这里给你一个简单的纯批处理 TRACER,它利用 FOR /F 行解析开关:

@ECHO OFF

FOR /F "delims=" %%L IN (%1) DO (

  CLS

  ECHO __________________________________________________
  ECHO                            ENV. VARIABLES *BEFORE*
  SET

  ECHO __________________________________________________
  ECHO                                               LINE
  ECHO %%L

  ECHO __________________________________________________
  ECHO Hit any key to execute the line ...
  PAUSE > NUL

  ECHO __________________________________________________
  ECHO                                            EXECUTE
  %%L

  ECHO __________________________________________________
  ECHO Hit any key to fetch the next line...
  PAUSE > NUL

)

ECHO END OF FILE

您可以将其作为开始,然后进行修改。

以下是您的使用方法:

DEBUG.BAT TEST.BAT

我还会给你一个测试文件来试一试:

@ECHO OFF

ECHO Hello World! 
SET aaa=1
SET bbb=2

ECHO Doing step 2
SET aaa=
SET ccc=3

ECHO Doing step 3
SET bbb=
SET ccc=

ECHO Finished!

这个DEBUG.BAT 的东西,然而,由于它的简单性,有一些限制但是,如果你在那里打了足够多的 BATCH-fu,就可以解决这些限制。

  • 它不能处理多行块 :: 这可以通过让FOR 命令解析令牌并在它们进入时构建行来解决,IF 它遇到了一个左括号,只是将括号块内容转储到临时文件,然后在临时文件上调用自身,例如DEBUG tempfile.bat
  • 它无法处理跳转 :: 当然,您可以使用IF 检查GOTO label,然后使用FOR /F 解析标签本身,然后可以使用第二个参数%2DEBUG.BAT 来指定要跳转到的标签,在这种情况下,如果指定了这个参数,您只需旋转FOR /F,直到看到所需的标签,然后在下一行进行正常调试。李>
  • 来自单个 SET 的信息太多 :: 只需执行您对 SET > before.txt 所做的操作,然后在每一行执行此操作,然后在文件(网上有很多)。然后,您将获得自上一步以来已更改的每个变量的 DIFF。你甚至可以避免环境。通过在 SETLOCALENDLOCAL 中拍打,变量完全混乱,然后你只会得到本地 SET ......但 YMMV。

这些是一些。如果您发现了一些引人注目的限制或任何可以帮助您解决最后一个错误的增强功能,请随时让我知道(通过 cmets),如果可以的话,我会尽力帮助您。

希望这会有所帮助。

【讨论】:

    【解决方案3】:

    不,没有办法调试旧式批处理文件。但是,您可以删除所有 ECHO OFF 语句,然后在运行时将所有命令和输出回显到控制台。

    【讨论】:

    • 任何以@开头的行也不会被回显
    【解决方案4】:

    如果您愿意花一些钱,您应该看看Running Steps 批处理文件IDE 及其调试功能。

    我没有对其进行测试,但它有一些功能可以帮助您完成任务:

    ...

    • 类似 Visual Studio 的调试环境。
    • 丰富的调试命令集(step into、step over、step out 等)
    • 丰富的项目分析器可立即找到您的错误和警告。
    • 对延迟扩展环境的集成支持 变量。
    • 多类型断点定义,满足您的多种调试需求。
    • 具有多色突出显示的复杂管道和重定向支持。
    • 环境变量可视化和修改支持。
    • 为真正的变量定义可视化扩展了信息窗口。
    • 令人印象深刻的“用于命令”展开功能。
    • 交互式调用堆栈和参数窗口。

    ...

    他们还提供试用版。

    【讨论】:

    • 正在运行的步骤链接现已失效 - 指向一个门户网站。
    猜你喜欢
    • 2014-03-18
    • 1970-01-01
    • 2020-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-18
    • 1970-01-01
    相关资源
    最近更新 更多