【问题标题】:Strange question about windows batch file关于windows批处理文件的奇怪问题
【发布时间】:2011-07-17 23:24:48
【问题描述】:

我的工作目录中有 1.txt2.txt。我使用以下批次列出所有文件。

批次是这样的:

@echo off
for /f "tokens=*" %%a in ('dir *.txt /b') do (
    echo ---------------
    set file_variable=%%a
    echo file_variable=%file_variable%
    echo filename=%%a
    )    

结果如下:

---------------
file_variable=2.txt   <---------------why it is not 1.txt here??
filename=1.txt
---------------
file_variable=2.txt
filename=2.txt

谢谢。

【问题讨论】:

    标签: scripting batch-file cmd


    【解决方案1】:

    你需要输入:

    @setlocal enableextensions enabledelayedexpansion
    

    在文件的顶部和

    endlocal
    

    在最后。

    那么你需要使用延迟扩展替换字符。

    @setlocal enableextensions enabledelayedexpansion
    @echo off
    for /f "tokens=*" %%a in ('dir *.txt /b') do (
        echo ---------------
        set file_variable=%%a
        echo file_variable=!file_variable!
        echo filename=%%a
    )
    endlocal
    
    C:\Documents and Settings\Pax\My Documents> qq.cmd
    ---------------
    file_variable=1.txt
    filename=1.txt
    ---------------
    file_variable=2.txt
    filename=2.txt
    

    您在没有延迟扩展的情况下看到的是,整个 for 循环在运行之前正在被评估。这包括替换,因此%file_variable% 将被替换为它在循环开始之前 保存的值。使用延迟扩展将评估推迟到执行实际行。


    Rob van der Woude's site 有各种精彩的 Windows 脚本技巧,其中包含在 Windows 下使用各种工具执行操作的许多不同方式。

    【讨论】:

    • @smwikipedia:这同样适用于您必须使用括号括起来的命令块的其他情况,例如if ... (...) else (...)
    • 有没有官方文档关于!variable的区别!和 %variable% 符号?
    • @smwikipedia,也可以查看robvanderwoude.com,它有很多有用的东西。
    【解决方案2】:

    在这种特殊情况下,如果您像这样回显file_variable,您可以获得正确的输出:

    CALL ECHO file_variable=%%file_variable%%
    

    @paxdiablo 的答案中描述的方法相比,这种方法的灵活性和性能可能较差。这可能只是延迟变量扩展的一种快速而肮脏的方法,而无需为此启用特殊语法。

    【讨论】:

      猜你喜欢
      • 2012-07-23
      • 1970-01-01
      • 2010-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多