Это сайт — моя персональная записная книжка. Интересна мне, по большей части, история, своя жизнь и немного программирование.

Бесполезное: переводим строку в десятичные коды

Недавно решил попристальнее посмотреть что нового появилось в 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%
8 комментариев
Азат Разетдинов (razetdinov.ya.ru) 2008

Ну и как, добрался до гланд? :-)

Евгений Степанищев (bolknote.ru) 2008

Комментарий для razetdinov.ya.ru:

В этом языке нет монад!!!111

aru.livejournal.com 2008

они готовят PowerShell и типа как замена CMD его позиционируют.

vkv.livejournal.com 2008

зачем смд, если есть wsh?

recoder.ya.ru 2008

Экий brainf*ck получается…

Евгений Степанищев (bolknote.ru) 2008

Комментарий для aru.livejournal.com:

Да у них Windows Script Host есть.

Евгений Степанищев (bolknote.ru) 2008

Комментарий для vkv.livejournal.com:

cmd быстрее писать

Евгений Степанищев (bolknote.ru) 2008

Комментарий для recoder.ya.ru:

И не говори, форменный brainf*ck