set /p
не работает с трубами, он занимает одну (случайную) строку от входа.
Но вы можете использовать more
внутри цикла for.
@echo off
setlocal
for /F "tokens=*" %%a in ('more') do (
echo #%%a
)
Но это не получается, если строки начинаются с точки с запятой (так как стандарт eol для FOR-LOOP равен ;
).
И он не может читать пустые строки.
Но с помощью findstr это тоже можно решить,префикс каждой строки с номером белья, так что вы никогда не получите пустых строк.
И затем префикс удаляется до первого двоеточия.
@echo off
setlocal DisableDelayedExpansion
for /F "tokens=*" %%a in ('findstr /n $') do (
set "line=%%a"
setlocal EnableDelayedExpansion
set "line=!line:*:=!"
echo(!line!
endlocal
)
В качестве альтернативы, в некоторых средах (например, WinRE), которые не включают findstr
, альтернативы с find.exe
может быть достаточно.find
примет пустую строку поиска ""
и разрешит инверсию поиска.Это позволило бы что-то вроде этого:
@echo off
setlocal DisableDelayedExpansion
for /F "tokens=*" %%a in ('find /v ""') do (
set "line=%%a"
echo(!line!
)