Как получить ввод по каналу в пакетном файле Windows? - PullRequest
0 голосов
/ 30 сентября 2018

Я хочу использовать команду, подобную xxx yyy | deal_everyline.bat, где команда xxx yyy будет генерировать некоторый вывод.Когда я использую deal_everyline.bat в консоли, все работает нормально.Однако, когда я проверяю его с cat A.txt | deal_everyline.bat, выводится только первая строка.Что я должен сделать, чтобы получить все строки?

@echo off
:loop
set input=
set /p input=
if "%input%" neq "" (
    echo %input%
    goto loop
)

1 Ответ

0 голосов
/ 01 октября 2018
Перочинный нож

предлагает использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...