【问题标题】:BATCH input redirection operatorBATCH 输入重定向运算符
【发布时间】:2011-01-11 00:00:29
【问题描述】:
set a=file
if exist "folder\%a%" ( 
 set /p x= < "folder\%a%" 
 echo %x% 
)

我一直在写批处理文件,但我不明白为什么 此代码不起作用。我期待代码回显的内容 %一个%。但它返回的只是 ECHO 的状态(Echo is ON

%a%(文件)包含一个字符串('keyword'),当 设置在 %x%

我什至尝试添加扩展名(.txt),但仍然不起作用

【问题讨论】:

    标签: file batch-file command redirect echo


    【解决方案1】:

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

    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!
    )
    

    【讨论】:

    • 请问延迟扩容是什么意思?
    • 如果 %a% 包含 ! (例如“foo!bar.txt”)然后您的代码会中断
    • %var% 在读取的那一刻扩展了行或括号块,然后执行该行或块的任何命令。必须启用延迟扩展,然后扩展 !var!与 %var% 类似,但在执行行或块的每个命令之前的那一刻,还要“设置 /?”解释它
    • @Anders:我更改了代码,所以如果 %a% 包含感叹号,它也可以工作
    • 哈哈抱歉让你解释在输入 set / 后有点困惑?这就是我问你的原因:P .thanks
    【解决方案2】:
    if exist "folder\%a%" ( 
     set /p x=< "folder\%a%"
     SETLOCAL ENABLEDELAYEDEXPANSION&echo !x!&ENDLOCAL
    )
    

    这与jeb的代码基本相同,但ENABLEDELAYEDEXPANSION不会影响路径,所以文件名带有!仍然可以工作(% 可能不起作用,但这是批处理文件和文件名的普遍问题)

    set /p x= &lt; .\somefile 有点小技巧,您可能需要考虑使用FOR /F "tokens=*" %%A ... 但 FOR 会读取每一行,除非您在 DO 中添加 if。所以如果你只想要第一行,你最终会得到这样丑陋的东西:

    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
    )
    

    【讨论】:

    • FOR-Loop 可以用 goto :label 中断
    猜你喜欢
    • 2018-08-24
    • 1970-01-01
    • 1970-01-01
    • 2013-12-15
    • 2012-12-30
    • 1970-01-01
    • 2021-09-08
    • 1970-01-01
    • 2015-07-18
    相关资源
    最近更新 更多