2010-03-02 42 views
8

我繼承了一些大型批處理文件,我想將它們重寫爲更「開發友好」的語言。有什麼方法可以跟蹤批處理文件的執行嗎?

我想找出以下的事情:

  • 它所說的其它腳本
  • 它開始什麼其他進程
  • 它寫
  • 什麼環境變量什麼文件,它使用,哪些設置

對於最後一點,我知道我可以在開始之前做到這一點:

set > original_environment.txt 

後,我運行它,我可以這樣做:

set > new_environment.txt 

,只是做他們之間的差異......但我可能會錯過一些變量,可能是未設置的,當腳本完成(如果腳本在setlocal下運行,甚至可以全部完成)。

是否有任何方法可以找到所有這些東西,而無需在整個腳本代碼中添加大量的echo語句? 有沒有這樣的工具,可以監視由批處理文件啓動的進程,並告訴我它所做的一切?

+1

在PowerShell中重寫它們。它具有調試功能。您還可以使用Idera出色的「PowerShell Plus」產品,並獲得互動調試體驗。 – 2010-03-02 19:57:24

+2

@John:我認爲OP的問題是更多的理解批處理文件是否重寫了另一種語言。所以你有點再次使相同的點:) – Joey 2010-03-02 20:00:08

+0

你可以從進程監控http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx,但其餘的一些信息。我希望你找到一些東西,但我不樂觀。 – 2010-03-02 20:04:00

回答

2

你可以在裏面看看,找出他們做了什麼。

您還可以刪除任何echo off語句和@前面的命令;這樣,每個命令在運行之前都會輸出,您可以將輸出重定向到一個文件以後再研究。

對於我知道的批處理文件,沒有調試工具 - 但我打算編寫一個。

+0

是的,但我必須確保所有其他被調用的腳本也沒有'echo off'。我正在考慮關於該工具的相同內容:) – Geo 2010-03-02 20:24:58

+0

@Geo:這樣一個工具的問題在於,您必須準確建模cmd的行爲。而且你不能僅僅以cmd執行這些行,因爲這往往與從批處理文件中運行不同的結果 - 一種天真的方法可能會失敗。儘管我認爲我有一個可以工作的想法,但您只需寫出另一個批處理文件,在每行之後包含一個「pause」語句,並將整個環境寫入文件供調試器抓取。可能不太漂亮,並且跟蹤打開的文件完全是另一個問題。 Process Monitor是一個不錯的提示,儘管 – Joey 2010-03-02 21:02:17

1

不,沒有辦法調試舊式批處理文件。但是,您可以擺脫所有ECHO OFF語句,然後在運行它們時將所有命令和輸出回顯到控制檯。

+0

任何以@開頭的行也不會被回顯 – 2010-03-02 20:09:30

1

如果你願意花一些錢,你應該看看Running Steps批處理文件IDE及其調試功能。

我沒有測試它,但它有一些特點,可以幫助你在你的任務:

...

  • 的Visual Studio般的調試環境。
  • 豐富的調試命令集(步入,跳出,跳出等)
  • Rich Project分析器可以很快找到您的錯誤和警告。
  • 對延遲擴展環境的整合支持 變量。
  • 多類型斷點定義,以適應您的多個調試需求。
  • 複雜的流水線和重定向支持與多色突出顯示。
  • 環境變量可視化和修改支持。
  • 真實變量定義可視化的擴展信息窗口。
  • 令人印象深刻的'For command'展開功能。
  • 交互式調用堆棧和參數窗口。

...

還提供試用版。

+0

Running Steps鏈接現在不存在 - 指向一個門戶網站。 – rossmcm 2014-01-13 22:46:49

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解析出標籤本身,那麼也許使用第二個參數的DEBUG.BAT%2以指定標籤跳轉至,在這種情況下,如果指定了這個參數,只需旋轉FOR /F,直到所需的標籤進入視圖,然後在下一行繼續正常調試。
  • 有從單一SET ::只是你與SET > before.txt和之後的事情做了什麼,但這樣做的每一行,然後運行該文件CMD線DIFF工具的信息太多(很多可在互聯網)。然後你會得到自上一步以來變化的每個變量的DIFF。你甚至可以避免env。變量混亂在SETLOCALENDLOCAL在那裏,然後你只會得到本地設置...但YMMV。

那些是一些。如果你已經發現了一些顯示停止的限制或者任何增強功能可以幫助你修復最後一個bug,請隨時通知我(通過評論),如果可以的話,我會盡力幫助你。

希望這會有所幫助。

相關問題