Я наследовал некоторые большие пакетные файлы, и я хотел бы переписать их большему количеству "разработчика дружественный" язык.
Я хотел бы узнать следующие вещи:
Для последней точки я знаю, что могу сделать это, прежде чем я запущу:
set > original_environment.txt
И после того, как я выполняю его, я могу сделать это:
set > new_environment.txt
и просто сделайте разность между ними..., но я, вероятно, пропущу некоторые переменные, которые могут быть сброшены, когда сценарий заканчивается (или даже все они, если сценарий работал под setlocal
).
Есть ли какой-либо способ найти все те вещи без меня добавляющий тонны операторов эха всюду по коду сценария? Есть ли такой инструмент, который может контролировать процесс, запущенный пакетным файлом, и сказать мне все, что он сделал?
Нет, нет возможности отлаживать командные файлы старого стиля. Однако вы можете просто избавиться от всех операторов ECHO OFF
, и тогда все команды и вывод будут выводиться на консоль, когда вы их запускаете.
Вы можете просто заглянуть в них и понять, что они делают.
Вы также можете удалить любые операторы echo off
и @
предыдущие команды; таким образом каждая команда выводится перед запуском, и вы можете перенаправить вывод в файл, чтобы изучить его позже.
Я не знаю ни одного инструмента отладки для пакетных файлов, но однажды я подумывал написать его.
Если вы готовы потратить немного денег, вам следует взглянуть на IDE командного файла Running Steps и его возможности отладки.
Я не тестировал его, но в нем есть некоторые функции, которые могут помочь вам в решении вашей задачи:
...
- Среда отладки, подобная Visual Studio.
- Богатый набор команд отладки (вход, выход, выход и т. Д.).
- Богатый анализатор проектов для быстрого обнаружения ошибок и предупреждений.
- Интегрированная поддержка переменных среды с отложенным расширением.
- Множественные определения точек останова для соответствия вашим многочисленным потребностям отладки.
- Сложный конвейер и поддержка перенаправления с многоцветной подсветкой.
- Поддержка визуализации и модификации переменных среды.
- Расширенное информационное окно для визуализации истинного определения переменной.
- Впечатляющая функция развертывания «Для команды».
- Интерактивный стек вызовов и окно параметров.
...
Еще они предлагают пробную версию.
Нет прямого способа сделать это. Но создать его не невозможно.
С выходом 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-fu.
FOR
анализируют токены и строят строки по мере их поступления, и IF
он обнаружил открытую скобку, просто выгрузите содержимое блока скобок во временный файл, а затем вызовите себя во временном файле, например DEBUG tempfile.bat
IF
проверку метки GOTO
, а затем выполнить FOR / F
для анализа самой метки, затем можно использовать второй аргумент % 2
из DEBUG.BAT
, чтобы указать метку, к которой нужно перейти, и в этом случае, если это Если указан аргумент, вы просто вращаете FOR / F
, пока нужная метка не появится в поле зрения, а затем продолжите обычную отладку на следующей строке. SET
:: Просто сделайте то, что вы сделали с SET> before.txt
и после, но сделайте это в каждой строке, а затем запустите cmd-line инструменты DIFF для файлов (многие доступны в сети). Затем вы получите DIFF каждой переменной, которая изменилась с последнего шага. Возможно, вы даже сможете избежать env. переменные вообще запутались, вставив туда SETLOCAL
и ENDLOCAL
, и тогда вы получите только локальные SET ... но YMMV. Это некоторые. Если вы обнаружили какое-то ограничение остановки показа или какие-либо улучшения, которые помогут вам исправить эту последнюю ошибку, не стесняйтесь, просто дайте мне знать (через комментарии), и я постараюсь вам помочь, если смогу.
Надеюсь, это поможет.