Что я делаю
Я пытаюсь смоделировать обработку исключений в пакете.Я знаю, что есть пост на форуме по DosTips, который подробно посвящен этой теме и даже содержит скрипт, который делает то, что вы ожидаете.Поскольку это рабочий проект, я не могу использовать их решение, поэтому я попробовал свои силы в этом.
Как я пытаюсь это сделать
Я пытался реализовать то, что яМы назовем «try catch бедного человека», который на самом деле является просто циклом FOR
, который запускает пакетные команды построчно, и если errorlevel
выше 0, строка перехватывается циклом в IF
изDO
пункт.Например, я попытался написать это в пакетном режиме:
@echo OFF
SET /A "LineCount=1"
FOR /F "tokens=* delims=" %%A IN ('SET "VarATest^=something" ^^ SET "VarBTest^=somethingelse" ^^ SE "VarCTest^=syntaxerror"') DO (SET /A "LineCount=1+!LineCount!" & IF !ERRORLEVEL! EQU 1 (echo errorlevel was: "!ERRORLEVEL!" and line was "!LineCount!") ELSE (echo line worked))
pause
В основном то, что предполагается сделать выше, это инициализировать переменную LineCount
, запустить три пакетных команды в предложении IN
(разделенныхстрока ^
заканчивается), и для каждой строки увеличьте значение LineCount
и проверьте, не вызвало ли строка errorlevel
чего-либо большего, чем 1 (!ERRORLEVEL! EQU 1
имеет такое странное поведение).Третья строка имеет очевидную синтаксическую ошибку: SET
пишется SE
, что должно вызывать errorlevel
выше 0. Смысл в демонстрации, это можно было бы уточнить, но сейчас это просто для подтверждения концепции.
проблема
К сожалению, когда я запустил этот код, он не запустил ничего, как ожидалось, вместо этого я получил только вывод паузы, но без ошибок.Я не верю, что он запускает строку предложения IN
построчно, как я ожидал, поэтому мой вопрос таков:
A.Можно ли запускать пакетные команды построчно в предложении IN
цикла FOR
, чтобы имитировать попытку try?Очевидно, это означает более частое использование отложенного расширения и escape-символов, но было бы здорово иметь эту элементарную функциональность.
B.Если это возможно, то как правильно сделать так, чтобы ввод условия IN
был неформатированным текстом, но в то же время многострочным.Например, предложение IN
прямо сейчас:
(SET "VarATest^=something" ^^ SET "VarBTest^=somethingelse" ^^ SE "VarCTest^=syntaxerror")
, которое я хочу, чтобы функционально было похоже на обычный код пакета:
SET "VarATest=something"
SET "VarBTest=somethingelse"
SE "VarCTest=syntaxerror"
Где третья строка явно вызываетошибка.Я не хочу использовать другой файл, если это возможно, поэтому нет временных файлов, содержащих код блока try.Буду ли я использовать ^
конец строки?Я попытался ^^
, думая, что мне нужно выйти из первой строки.Я также пробовал переводы строк, где были ^^
, но это тоже не работало.Я попытался изменить разделители, чтобы попытаться разделить команды таким образом, может быть, запускать их каждый таким образом, но все равно я не получаю вывод.полезно, но, к сожалению, не принесло решения, однако после того, как я поработал, я придумал следующее:
@echo OFF && setlocal enableextensions enabledelayedexpansion
SET lf=^&echo/^^
SET /A "LineCount=0"
FOR /F "tokens=*" %%A IN ('call!lf!SET "VarATest^=something"!lf!SET "VarBTest^=somethingelse"!lf!SET "VarCTest^=syntaxerror"!lf!') DO (SET /A "LineCount=1+!LineCount!" && echo ER: "!ERRORLEVEL!" or "%ERRORLEVEL%" A: "%%A" && IF !ERRORLEVEL! NEQ 0 (echo errorlevel was: "!ERRORLEVEL!" and line was "!LineCount!") ELSE (echo line worked = !LineCount!))
pause >nul
echo/!LineCount! && pause >nul
Теперь это в основном ответ с несколькими оговорками.Добавление в часть "tokens=*"
фактически дает полную строку SET
.Ответ предоставлен механизм перевода строки.Экспериментально я заметил, что call!lf!
был необходим ДО первой команды в «строке».Я понятия не имею, почему, но это не работает по-другому, потому что цикл FOR
, похоже, хочет пропустить первый аргумент.Я получил распечатку каждой командной строки в строке через %% A.фантастика!Единственная проблема заключается в том, что ошибки не обнаруживаются, когда они должны быть.ERRORLEVEL
не меняется, когда я изменяю последнюю командную строку с
SET "VarCTest^=syntaxerror"
на:
ST "VarCTest^=syntaxerror"
или любые другие подобные варианты, которые могут вызвать ошибку.Проблема в том, что команды SET
никогда не выполняются.Эхо их после цикла FOR
показывает это.Я собираюсь попытаться заставить их работать