BATCH оператор перенаправления ввода - PullRequest
1 голос
/ 11 января 2011
set a=file
if exist "folder\%a%" ( 
 set /p x= < "folder\%a%" 
 echo %x% 
)

Я давно пишу командные файлы, но не понимаю, почему этот код не работает.Я ожидаю, что код отобразит содержимое% a%.но все, что он возвращает, это состояние ECHO ( Эхо ВКЛ )

% a% (файл) содержит строку ('ключевое слово'), которая, как ожидается, будет отображаться при установкев% x%

я даже пытался поставить расширение (.txt), но все равно оно не работает

Ответы [ 2 ]

2 голосов
/ 11 января 2011

Это не работает, потому что полный блок скобок (а также echo% x%) вычисляется до того, как будет выполнено "set / p", вы можете перейти на отложенное расширение.

SETLOCAL EnableDelayedExpansion
set a=file
if exist "folder\%a%" ( 
 set /p x= < "folder\%a%" 
 echo !x!
)

[EDIT]

Этот код также принимает восклицательные знаки в имени файла

set "a=folder\foo!bar.txt"
SETLOCAL EnableDelayedExpansion
if exist "!a!" (
  set /p x= < "!a!"
  echo !x!
)
1 голос
/ 11 января 2011
if exist "folder\%a%" ( 
 set /p x=< "folder\%a%"
 SETLOCAL ENABLEDELAYEDEXPANSION&echo !x!&ENDLOCAL
)

Это в основном тот же код, что и в jeb, но ENABLEDELAYEDEXPANSION не влияет на путь, поэтому имена файлов с!все равно будет работать (%, вероятно, не будет работать, но это общая проблема с пакетными файлами и именами файлов)

set /p x= < .\somefile - это что-то вроде хака, вы можете рассмотреть возможность использования FOR /F "tokens=*" %%A ...но FOR будет читать каждую строку, если вы не вставите if в DO.Таким образом, вы получите нечто ужасное, если захотите только первую строку:

set eof=0
for /F "tokens=*" %%A IN ('type "folder\%a%" 2^>nul') DO (
    SETLOCAL ENABLEDELAYEDEXPANSION&(if "!eof!"=="0" (echo.%%A))&ENDLOCAL
    set eof=1
)
...