有没有办法追踪批处理文件的执行?

时间:2010-03-02 19:54:23

标签: winapi refactoring batch-file environment

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

我想找出以下内容:

  • 它所谓的其他脚本
  • 它启动的其他流程
  • 它写入的文件
  • 它使用了哪些环境变量,它设置了哪些

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

set > original_environment.txt

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

set > new_environment.txt

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

如果没有在整个脚本代码中添加大量的echo语句,有没有办法找到所有这些东西? 是否有这样的工具可以监视批处理文件启动的进程并告诉我它所做的一切?

4 个答案:

答案 0 :(得分:2)

你可以查看它们并找出它们的作用。

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

我所知道的批处理文件没有调试工具 - 但我打算写一次。

答案 1 :(得分:2)

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

由于Windows XP / Vista / 7出现了很好的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因为它的简单性而有一些限制 BUT 如果你在那里打了足够的BATCH-fu就可以解决这个问题。

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

那些是一些。如果你发现一些显示限制或任何增强功能可以帮助你确定最后一个错误,请随时告诉我(通过评论),如果可以,我会尽力帮助你。

希望这有帮助。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

我没有测试它,但它有一些功能可以帮助你完成任务:

  

...

     
      
  • 类似Visual Studio的调试环境。
  •   
  • 丰富的调试命令(步入,步进,步出等)
  •   
  • Rich Project分析器可以立即找到您的错误和警告。
  •   
  • 对延迟扩展环境的综合支持   变量
  •   
  • 多类型断点定义,以满足您的多种调试需求。
  •   
  • 复杂的管道和重定向支持,支持多色突出显示。
  •   
  • 环境变量可视化和修改支持。
  •   
  • 扩展信息窗口,用于真正的变量定义可视化。
  •   
  • 令人印象深刻的'For command'展开功能。
  •   
  • 交互式callstack和Parameters窗口。
  •   
     

...

他们还提供试用版。