FOR-LOOP обычно работает, но есть некоторые проблемы.
FOR не принимает пустые строки, а строки с более чем 8190 проблематичны.
Расширение работает только надежно, если отложенное расширение отключено.
Обнаружение CR / LF по сравнению с одиночным LF также кажется немного сложным.
Также NUL-символы проблематичны, так как цикл FOR немедленно отменяет чтение.
Прямое двоичное считывание кажется почти невозможным.
Проблема с пустыми строками может быть решена с помощью хитрости. Приставьте каждую строку к номеру строки, используя команду findstr, и после прочтения удалите префикс.
@echo off
SETLOCAL DisableDelayedExpansion
FOR /F "usebackq delims=" %%a in (`"findstr /n ^^ t.txt"`) do (
set "var=%%a"
SETLOCAL EnableDelayedExpansion
set "var=!var:*:=!"
echo(!var!
ENDLOCAL
)
Переключение между включенным и отключенным отложенным расширением необходимо для безопасной работы со строками, например !
или ^^^xy!z
.
Это связано с тем, что строка set "var=%%a"
безопасна только с DisabledDelayedExpansion , в противном случае восклицательные знаки удаляются, а знаки вставки используются в качестве (вторичных) escape-символов и также удаляются.
Но использование переменной var
безопасно только с EnabledDelayedExpansion , так как даже call %%var%%
не удастся с таким содержимым, как "&"&
.
РЕДАКТИРОВАТЬ: Добавлен вариант набора / р
Существует второй способ чтения файла с set /p
, единственными недостатками являются то, что он ограничен ~ 1024 символами в строке и удаляет управляющие символы в конце строки.
Но преимущество в том, что вам не нужно было задерживать переключение, и легче хранить значения в переменных
@echo off
setlocal EnableDelayedExpansion
set "file=%~1"
for /f "delims=" %%n in ('find /c /v "" %file%') do set "len=%%n"
set "len=!len:*: =!"
<%file% (
for /l %%l in (1 1 !len!) do (
set "line="
set /p "line="
echo(!line!
)
)
Для чтения "двоичного" в шестнадцатеричное представление
Вы можете посмотреть на SO: преобразование двоичного файла в представление HEX с использованием командного файла