BATCH输入重定向运算符

时间:2011-01-11 00:00:30

标签: file batch-file command redirect echo

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

我已经写了很长时间的批处理文件,但我不明白为什么 这段代码不起作用。我期待代码回应出来的内容 %一个%。但它返回的只是ECHO的状态( Echo is ON

%a%(文件)包含一个字符串('keyword'),该字符串应该在何时被回显 在%x%中设置

我甚至试图放一个扩展名(.txt),但它仍无法正常工作

2 个答案:

答案 0 :(得分:2)

它不起作用,因为在执行“set / p”之前评估完整的括号块(以及echo%x%),你可以改为延迟扩展。

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

<强> [编辑]

此代码还接受文件名

中的感叹号
set "a=folder\foo!bar.txt"
SETLOCAL EnableDelayedExpansion
if exist "!a!" (
  set /p x= < "!a!"
  echo !x!
)

答案 1 :(得分:1)

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
)