Перочинный нож
предлагает использовать MORE
с FOR /F
, но это повредит вкладки, и оно зависает на 64K строк ввода.Лучше использовать FINDSTR "^"
.Синтаксис нечетных опций FOR / F - это способ отключить опции EOL
и DELIMS
, чтобы сохранить непустые строки точно до тех пор, пока они имеют длину <~ 8191 байт. </p>
@echo off
for /f delims^=^ eol^= %%A in ('findstr "^"') do (
echo(%%A
)
Приведенный выше код пропустит пустые строки.Если вы хотите сохранить их, используйте опцию FINDSTR / N, чтобы поставить перед каждой строкой номер строки, за которым следует двоеточие, сохранить значение в переменной среды, а затем использовать расширение переменной для удаления префикса.Переменные должны быть расширены с отложенным расширением в цикле FOR, но отложенное расширение нельзя включить при расширении %%A
, иначе оно повредит символы !
.Таким образом, отложенное расширение включается и выключается в цикле
@echo off
setlocal disableDelayedExpansion
for /f delims^=^ eol^= %%A in ('findstr /n "^"') do (
set "ln=%%A"
setlocal enableDelayedExpansion
set "ln=!ln:*:=!"
echo(!ln!
endlocal
)
Если вы хотите сохранить изменения переменных среды на протяжении итераций, то ВЫЗЫВАЙТЕ подпрограмму с постоянно отложенным расширением.Но имейте в виду, что нормальное процентное расширение переменных может потерпеть неудачу в зависимости от содержимого.Например, без кавычек <
, >
, &
и |
все вызовет проблемы.
@echo off
setlocal disableDelayedExpansion
for /f delims^=^ eol^= %%A in ('findstr /n "^"') do (
set "ln=%%A"
call :processLine
)
exit /b
:processLine
set "ln=%ln:*:=%"
echo(%ln%
exit /b