Бесполезное: переводим строку в десятичные коды
Недавно решил попристальнее посмотреть что нового появилось в CMD (язык пакетных файлов Windows) со времён Windows NT. Написал небольшую программу, которая переводит строку в десятичные коды. Мне показалось, что CMD стал ещё более нелогичным чем был. Например, я так и не догадался как решить все проблемы с кавычками. Какое бы решение я не придумывал для того, чтобы проверить входной параметр, я тут же придумывал решение для того, чтобы разрушить код.
В итоге, исключить в программе влияние кавычек я не смог. Если у кого-то получится, расскажите как это делается в CMD. Вот программа:
@ECHO OFF
REM BOLK
REM Вспомогательная процедура для прохождения по массиву
IF NOT "%2"=="" GOTO :LINE
SETLOCAL
REM Входной параметр
SET LINE="%~1"
ECHO In: %LINE%
REM Сюда попадёт результат из ONE
SET OUT=""
REM Переменная останова вспомогательной процедуры
SET LINEBREAK=0
REM Сюда мы поместим результат и выведем его
SET RESULT=
CALL :ONE
REM ECHO Out: %OUT%
REM GOTO :EOF
REM Цикл прохода для DEBUG, который даст нам кучу переменных с шестнадцатеричными
REM значениями в каждой
(ECHO E100 %OUT% 0 && ECHO D100 && ECHO Q) | ^
FOR /F "usebackq tokens=2-15 skip=2 delims=- " %%a IN (`DEBUG`) DO ^
@CALL %0 %%a %%b %%c %%d %%e %%f %%g %%h %%i %%j %%k %%l %%m %%n
GOTO :EOF
: Процедура осторожного разбора входной строки, разбираем так,
: чтобы спецсимволы не попали в код
:ONE
SET L="%LINE:~-2,1%"
REM Это для DEBUG — нужно чтобы заэкранировалась кавычка
IF ^%L:~1,-1%==^" (
SET OUT="""%OUT:~1,-1%
) ELSE (
SET OUT="%L:~1,-1%%OUT:~1,-1%"
)
SET LINE="%LINE:~1,-2%"
IF NOT %LINE%=="" GOTO ONE
GOTO :EOF
: Процедура для прохода по массиву. Так как вызывается через pipe,
: тормозить придётся самостоятельно — родительский процесс ничего отсюда
: не получает
:LINE
IF %LINEBREAK%==1 GOTO :EOF
IF "%1"=="00" (SET LINEBREAK=1 && ECHO %RESULT% && GOTO :EOF)
CALL :CHAR %1
SHIFT
GOTO LINE
: Победа разума над CMD — преобразование hex->dec
:CHAR
SET /A RES=0x%1
IF DEFINED RESULT (SET RESULT=%RESULT% %RES%) ELSE SET RESULT=%RES%
Ну и как, добрался до гланд? :-)
Комментарий для razetdinov.ya.ru:
В этом языке нет монад!!!111
они готовят PowerShell и типа как замена CMD его позиционируют.
зачем смд, если есть wsh?
Экий brainf*ck получается…
Комментарий для aru.livejournal.com:
Да у них Windows Script Host есть.
Комментарий для vkv.livejournal.com:
cmd быстрее писать
Комментарий для recoder.ya.ru:
И не говори, форменный brainf*ck