代码之家  ›  专栏  ›  技术社区  ›  dls

Windows XP批处理文件concat

  •  1
  • dls  · 技术社区  · 16 年前

    我正在努力完成以下荒谬的任务:

    我有一个包含一组完全限定的文件名的文本文件。我想遍历该文件并将每一行附加到一个公共变量,该变量可以传递给命令行工具。例如,文件可能是:

    C:\DR\Test.txt

    C:\windows\test2.txt文件

    C:\TeX3.TXT

    我想把它们赋给一些变量“a”,这样:

    a = "C:\dir\test.txt C:\WINDOWS\test2.txt C:\text2.txt"
    

    第二个问题是-什么是好的批处理文件引用?我在Windows材料和许多本地网站中找到了一些东西,但没有特别完整的。

    4 回复  |  直到 8 年前
        1
  •  9
  •   Joey Gumbo    16 年前

    至于参考文献, SS64.com 不错。 Rob van der Woude 也经常被联系起来。


    至于你的问题,很简单:

    @echo off
    setlocal enableextensions enabledelayedexpansion
    
    set LIST=
    for /f %%x in (yourfile.txt) do (
        set LIST=!LIST! "%%x"
    )
    
    echo %LIST%
    
    endlocal
    

    更深入的解释:

    setlocal enableextensions enabledelayedexpansion
    

    我们正在启用 延迟膨胀 在这里。这一点至关重要,否则我们将无法在 for 循环如下。

    for /f %%x in (yourfile.txt) do (
        set LIST=!LIST! "%%x"
    )
    

    for /f 迭代一个文件中的行,所以我们在这里需要什么。在每个循环迭代中,我们将下一行附加到 LIST 变量。注意使用 !LIST! 而不是平常 %LIST% . 这表示延迟了扩展,并确保每次运行此命令时重新评估变量。

    通常 cmd 一旦一行被读取和解析,就将变量扩展为其值。为了 CMD 一条线不是一条线就是所有 计数 作为一行,它恰巧适用于由括号分隔的块,如我们在这里使用的括号。所以 CMD 完整块是一个单独的语句,不管循环内部的运行频率如何,它都会被读取和解析一次。

    如果我们能用 %%的百分比 这里而不是 !名单! 然后变量将立即被其值替换(此时为空),循环将如下所示:

    for /f %%x in (yourfile.txt) do (
        set LIST= "%%x"
    )
    

    显然这不是我们想要的。延迟扩展确保只有在真正需要变量值时才扩展变量。在这种情况下,当循环内部运行并构造文件名列表时。

    之后变量 %%的百分比 !名单! (现在使用哪个并不重要)包含文件中的行列表。

    有趣的是,帮助 set 命令正好包括延迟扩展的示例:

    最后,支持延迟 环境变量扩展具有 增加了。这种支持总是 默认禁用,但可以 通过/v命令启用/禁用 行切换到cmd.exe。见命令/?

    延迟环境变量扩展 有助于 当前扩展的限制 当一行文本 读取,执行时不读取。这个 下面的示例演示 直接变量问题 扩展:

    set VAR=before
    if "%VAR%" == "before" (
        set VAR=after
        if "%VAR%" == "after" @echo If you see this, it worked
    )
    

    不会显示消息,因为 两个if语句中的%var%都是 当第一个if 语句被读取,因为它是逻辑的 包括国际单项体育联合会的主体,即 复合语句。所以如果 复合语句的内部是 真的比较“之前”和“之后” 永远不会平等。同样地, 以下示例不适用于 预期:

    set LIST=
    for %i in (*) do set LIST=%LIST% %i
    echo %LIST%
    

    因为它不会建立一个 当前目录中的文件,但是 相反,只需设置列表 找到最后一个文件的变量。 同样,这是因为%list%是 仅扩展一次 语句被读取,此时 列表变量为空。所以 我们正在执行的实际for循环是:

    for %i in (*) do set LIST= %i
    

    它只是将列表设置为 找到最后一个文件。

    延迟环境变量扩展 允许您使用不同的 字符(感叹号)到 在处展开环境变量 执行时间。如果延迟变量 已启用扩展,上述 举例如下 按预期工作:

    set VAR=before
    if "%VAR%" == "before" (
        set VAR=after
        if "!VAR!" == "after" @echo If you see this, it worked
    )
    
    set LIST=
    for %i in (*) do set LIST=!LIST! %i
    echo %LIST%
    
        2
  •  0
  •   JRL    16 年前

    你所追求的可以用 FOR f命令。

    这里有一个我使用过很多次的好资源:

    http://www.robvanderwoude.com/batchfiles.php

        3
  •  0
  •   TerryC    16 年前

    一本好书:TimHill编写的WindowsNT shell脚本。我在1998年出版的版本,但它仍然适用于Windows 2008中的Windows命令程序。

        4
  •  0
  •   based2    15 年前
    type *commonfilepart* >> concat_result_file
    

    操作系统:Windows Server 2003

    推荐文章