2010-03-02 3 views
8

큰 배치 파일을 상속 받았으며 더 "개발자 친화적 인"언어로 다시 작성하고 싶습니다.배치 파일 실행을 추적 할 수있는 방법이 있습니까?

나는 다음과 같은 일을 찾으려면 :

가 호출 어떤 다른 스크립트
  • 그것이
  • 어떤 환경 변수에 어떤 파일을 쓰기 않습니다 시작 어떤 다른 프로세스
  • 그 어떤 것을 설정합니까?

마지막으로, 시작하기 전에 이것을 할 수 있다는 것을 알고 있습니다.

set > original_environment.txt 

그리고 그것을 실행 한 후,이 작업을 수행 할 수 있습니다

set > new_environment.txt 

을 단지 그들 사이 DIFF을 ...하지만 난 아마 해제 할 수있는 몇 가지 변수를 놓칠 때 스크립트 (또는 스크립트가 setlocal 이하인 경우 모두 포함).

스크립트 코드 전체에 걸쳐 수십 개의 echo 문을 추가하지 않고도 이러한 모든 것을 찾을 수있는 방법이 있습니까? 배치 파일에 의해 시작된 프로세스를 모니터하고 모든 작업을 수행 할 수있는 도구가 있습니까?

+1

PowerShell로 다시 작성하십시오. 그것은 디버깅 기능을 가지고 있습니다. Idera의 우수한 "PowerShell Plus"제품을 사용하여 대화 형 디버깅 경험을 얻을 수도 있습니다. –

+2

@ 존 : OP의 문제는 배치 파일이 다른 언어로 다시 작성해야한다는 것을 더 잘 이해하고 있다고 생각합니다. 따라서 다시 같은 지점을 만들고있는 것입니다 :) – Joey

+0

프로세스 모니터 http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx에서이 정보 중 일부를 얻을 수 있지만 나머지는 마찬가지입니다. 네가 뭔가를 찾길 바래.하지만 나는 낙관적이지 않아. –

답변

2

당신은 그 내부를 들여다 그들이하는 일을 파악할 수 있습니다.

앞의 모든 echo off 문과 @ 명령을 제거 할 수도 있습니다. 그런 식으로 모든 명령이 실행되기 전에 출력되고 출력을 파일로 재지 정하여 나중에 연구 할 수 있습니다.

내가 알고있는 배치 파일 용 디버깅 도구는 없지만 한 번 작성하는 것을 고려했습니다.

+0

네,하지만 다른 모든 스크립트도'echo off'를하지 않도록해야합니다. 도구에 관해서도 같은 생각을하고 있습니다 :) – Geo

+0

@Geo : 이러한 도구의 문제점은 cmd의 동작을 정확하게 모델링해야한다는 것입니다. cmd에서 라인을 하나씩 실행할 수는 없습니다. 배치 파일에서 실행될 때와 다른 결과를 종종 낳기 때문입니다. 순진한 접근 방법은 실패 할 가능성이 높습니다. 내가 생각할 수있는 아이디어가 있다고 생각하지만, 각 행 다음에'pause' 문을 포함하는 또 다른 배치 파일을 작성하고 디버거가 잡을 수있는 파일에 완전한 환경을 작성하기 만하면됩니다. 너무 예쁘지 않고 열린 파일을 추적하는 것이 완전히 다른 문제입니다. 그러나 프로세스 모니터는 좋은 팁이었습니다. – Joey

1

아니요, 이전 스타일의 배치 파일을 디버그 할 수있는 방법이 없습니다. 당신은 단지 모든 ECHO OFF 문장을 제거 할 수 있습니다. 그리고 명령과 출력은 콘솔을 실행할 때 콘솔에 echo됩니다.

+0

@로 시작하는 줄도 반향되지 않습니다 –

1

돈을 쓰고 싶다면 Running Steps 배치 파일 IDE와 디버깅 기능을 살펴 봐야합니다.

나는 그것을 테스트하지 못했지만, 그것은 당신의 작업에 도움이 수있는 몇 가지 기능이 있습니다

...

  • 비주얼 스튜디오와 같은 디버깅 환경을.
  • 풍부한 디버깅 명령 집합 (단계별, 스텝 오버, 스텝 아웃 등)
  • 풍부한 프로젝트 분석기로 오류 및 경고를 즉시 찾을 수 있습니다.
  • 지연 확장 된 환경에 대한 통합 지원 변수.
  • 여러 디버깅 요구에 맞게 여러 유형의 중단 점 정의.
  • 다중 색상 강조 표시가있는 복잡한 파이프 라인 및 리디렉션 지원.
  • 환경 변수 시각화 및 수정 지원.
  • 진정한 변수 정의 시각화를위한 확장 정보 창.
  • 인상적인 'For 명령'풀기 기능.
  • 대화 형 호출 스택 및 매개 변수 창.

...

는 또한 평가판을 제공합니다.

+0

실행 단계 링크가 비활성화되었습니다 - 포털 사이트를 가리 킵니다. – rossmcm

2

직접적인 방법은 없습니다. 그러나 하나를 만드는 것은 불가능하지 않습니다.

이후 윈도우 XP/많은되지도 RTFM (FOR /??)

그래서 여기 내가 당신을 줄 그들을 사용하거나 있지만 비스타/7, 크게 업그레이드 된 DOS 배치 명령의 good'ole 세트를 나왔다, FOR /F 라인 분석 스위치를 사용하는 간단한 순수 배치 TRACER는 :

@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 

당신은 시작으로 그것을 가지고 당신이가는대로 수정할 수 있습니다. 그러나,

@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 일 :

DEBUG.BAT TEST.BAT 

그리고 또한 당신에게 그것을 밖으로 시도하는 테스트 파일을주지 :

여기 당신이 그것을 사용하는 거라고 방법 단순함으로 인해 BATCH-fu를 충분히 치면 해결할 수있는 몇 가지 제한이 있습니다. BUT

  • 그냥 괄호를 덤프,이 : 이것은 FOR 명령 토큰을 구문 분석하고 그들이에서 와서 라인을 구축함으로써 해결할 수 있으며, IF가 열린 괄호가 발생 멀티 라인 블록을 처리 할 수 ​​없습니다 콘텐츠를 임시 파일에 차단 한 다음 임시 파일에서 자신을 호출하십시오. DEBUG tempfile.bat
  • 그것은 할 수없는 프로세스가 점프 :: GOTO label 다음 라벨 자체를 구문 분석하는 FOR /F을 당신은 물론, IF 검사를 할 수있는, 어쩌면로 이동하는 레이블을 지정하는 두 번째 인수 DEBUG.BAT%2을 활용 이 경우 매우 유용한 인수를 지정하면 원하는 레이블이 표시 될 때까지 FOR /F을 스핀하고 다음 줄에서 정상적인 디버깅을 계속합니다.
  • 하나의 정보가 너무 많습니다. SET :: SET > before.txt의 작업을 수행하고 각 줄마다 작업을 수행 한 다음 파일에 cmd-line DIFF 도구를 실행하십시오. 그물). 그런 다음 마지막 단계 이후 변경된 각 변수의 DIFF가 표시됩니다. env를 피할 수도 있습니다.변수는 모두 SETLOCALENDLOCAL에 두드려서 혼란 스럽습니다. 그런 다음에는 로컬 SET 만 얻을 수 있습니다. 그러나 YMMV.

일부입니다. 마지막으로 버그를 잡는 데 도움이되는 몇 가지 제한점이나 개선점을 발견했다면 (코멘트를 통해) 알려 주시면 최대한 도와 드리겠습니다.

희망이 도움이됩니다.

관련 문제