从Excel(VBA)开始:启动一个外部交互式程序,然后在其中启动命令并读取其输出:这可能吗?

时间:2019-01-21 15:14:30

标签: excel vba external-process

目前,我正在执行以下操作来分析内存泄漏:

  1. 我使用Windbg打开两个转储。
  2. 我启动heap_stat脚本,这是一个基于Python的脚本,用于汇总堆中使用的对象。
  3. 我复制两个heap_stat脚本的结果,然后将它们粘贴到用于分析结果的Excel工作表中。

我想使用VBA从最终的Excel工作表开始自动执行以下操作:

  1. 启动一个外部程序(Windbg.exe)的两个实例,并用它们打开两个转储。
  2. 在那些Windbg实例中,启动必要的命令(.load pykd.pykd,后跟.py heap_stat.py -stat)。
  3. 等待heap_stat.py脚本完成,然后将结果复制到Excel工作表中。
  4. 添加一些必要的Match()工作表函数和Excel公式以完成分析。

为此,我需要能够:

  1. 从VBA启动外部程序。可以使用Shell命令来完成。
  2. 在该外部程序中,启动另外两个命令。 (启动一个命令很容易,如here所述,但是两个呢?)在这种情况下是不可能的:Windbg允许使用分号来连接命令,因此可以跳过。为了执行此操作,我正在考虑上述URL中解释的技巧。
  3. 等待一切完成。可以使用this link来完成。
  4. 读取输出。

我的问题是:是否可以读取输出?我知道可以等待命令完成,以验证结果是否正确或是否有错误,但是我找不到读取该命令抛出的实际输出的方法。

有人知道这是否(轻松)可行吗?

2 个答案:

答案 0 :(得分:1)

如果要将pykd用于全自动任务,为什么需要在windbg内运行它? 您可以制作一个独立的python脚本。

答案 1 :(得分:0)

我找到了解决我问题的方法:

  • 我将修改我的heap_stat脚本,最后将创建一个空的(标志)文件。
  • 我将从Excel VBA中进行如下操作:

    Shell "windbg -z ""C:\Directory\Dumpfile.dmp"" -c "".load pykd.pyd;.logopen C:\Directory\output.txt;!py heap_stat.py -stat""", vbMaximizedFocus
    
    • Windbg命令的含义如下:

      .load pykd.pyd         // load PYKD library
      .logopen ...           // open a logfile, for all Windbg output (thanks, Zac and Tate, for the idea)
      !py heap_stat.py -stat // launch the heap_stat script
      
  • 我将编写一个while循环,以验证标志文件的存在。
  • 输出文件的内容将被复制到Excel文件中,然后进行分析。