Есть ли способ отследить выполнение командного файла? - PullRequest
8 голосов
/ 02 марта 2010

Я унаследовал несколько больших пакетных файлов, и я хотел бы переписать их на более «дружественный для разработчиков» язык.

Я бы хотел узнать следующее:

  • какие еще скрипты он называет
  • какие еще процессы он запускает
  • в какие файлы записывает
  • какие переменные окружения он использует, какие переменные он устанавливает

Что касается последнего пункта, я знаю, что могу сделать это до того, как начну:

set > original_environment.txt

И после того, как я запустил это, я могу сделать это:

set > new_environment.txt

и просто сделайте различие между ними ... но я, вероятно, пропущу некоторые переменные, которые могут быть не установлены, когда скрипт завершится (или даже все из них, если скрипт работал под setlocal).

Есть ли способ найти все эти вещи, не добавляя тонны эхо-операторов в код скрипта? Есть ли такой инструмент, который может отслеживать процесс, запущенный командным файлом, и сообщать мне все, что он сделал?

Ответы [ 4 ]

2 голосов
/ 03 марта 2010

Нет прямого способа сделать это. Но это не невозможно создать.

С момента выхода 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, однако, из-за своей простоты имеет некоторые ограничения НО , которые можно обойти, если вы добавите туда достаточно BATCH-фу.

  • Он не может обрабатывать многострочные блоки :: Эту проблему можно обойти, если команды FOR разбирают токены и строят строки по мере их поступления, а IF встречает открытую скобку просто сбросьте содержимое блока скобок во временный файл и затем вызовите себя для временного файла, например DEBUG tempfile.bat
  • Он не может обрабатывать переходы :: Конечно, вы можете IF проверить GOTO label, затем FOR /F, чтобы разобрать саму метку, затем, возможно, использовать второй аргумент %2 из DEBUG.BAT, чтобы указать метку для перехода, и в этом случае, если указан именно этот аргумент, вы просто вращаете FOR /F до тех пор, пока не появится нужная метка, а затем продолжите обычную отладку на следующей строке.
  • Слишком много информации из одного SET :: Просто сделайте то, что вы сделали с SET > before.txt и после, но сделайте это в каждой строке, а затем запустите инструменты DIFF для cmd-line на файлы (множество доступно в сети). Затем вы получите DIFF каждой переменной, которая изменилась с последнего шага. Вы могли бы даже быть в состоянии избежать env. Переменные запутываются, просто добавив туда SETLOCAL и ENDLOCAL, и тогда вы получите только локальные наборы ... но YMMV.

Это некоторые. Если вы обнаружили какое-либо ограничение остановки показа или какие-либо улучшения, которые могли бы помочь вам решить эту последнюю ошибку, просто дайте мне знать (через комментарии), и я постараюсь помочь вам, если смогу.

Надеюсь, это поможет.

2 голосов
/ 02 марта 2010

Вы можете просто заглянуть в них и понять, что они делают.

Вы также можете удалить любые echo off операторы и @ предшествующие команды; таким образом, каждая команда выводится до ее запуска, и вы можете перенаправить вывод в файл для последующего изучения.

Не существует инструмента отладки для пакетных файлов, о котором я знаю, но я подумал написать один раз.

1 голос
/ 03 марта 2010

Если вы готовы потратить немного денег, вам стоит взглянуть на Running Steps IDE пакетного файла и его возможности отладки.

Я не тестировал его, но у него естьнекоторые функции, которые могут помочь вам в вашей задаче:

...

  • Visual Studio-подобная среда отладки.
  • Богатый набор команд отладки (шаг за шагом, шаг за шагом и многое другое)
  • Rich Project Analyzer для быстрого поиска ошибок и предупреждений.
  • Интегрированная поддержка переменных среды с отложенным расширением.
  • Многотипные определения точек останова для удовлетворения ваших многочисленных потребностей в отладке.
  • Сложная поддержка конвейера и перенаправления с многоцветной подсветкой.
  • Поддержка визуализации и модификации переменных среды.
  • Расширенное информационное окно для визуализации истинного определения переменной.
  • Впечатляющая функция развёртывания 'Для команды'.
  • Интерактивный стек вызовов и окно параметров.

...

Они также предлагают пробную версию.

1 голос
/ 02 марта 2010

Нет, нет способа отладки пакетных файлов старого стиля. Однако вы можете просто избавиться от всех операторов ECHO OFF, и тогда все команды и выходные данные будут выводиться на консоль при их запуске.

...