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

通过批处理文件将长命令拆分为多行

  •  606
  • Dan  · 技术社区  · 16 年前

    如何在批处理文件的多行上拆分长命令?

    5 回复  |  直到 5 年前
        1
  •  761
  •   Maximilian Burszley    7 年前

    可以用插入符号分隔长行 ^ 只要您记得插入符号及其后面的换行符被完全删除。所以,如果有一个空间,你打破了线,包括一个空间。 ( More on that below. )

    例子:

    copy file1.txt file2.txt
    

    将写为:

    copy file1.txt^
     file2.txt
    
        2
  •  231
  •   Peter Mortensen mkoryak    6 年前

    插入符号的规则是:

    一个插入符号在行尾,附加下一行,附加行的第一个字符将被转义。

    您可以多次使用插入符号,但整行不能超过~8192个字符(WindowsXP、WindowsVista和Windows7)的最大行长度。

    echo Test1
    echo one ^
    two ^
    three ^
    four^
    *
    --- Output ---
    Test1
    one two three four*
    
    echo Test2
    echo one & echo two
    --- Output ---
    Test2
    one
    two
    
    echo Test3
    echo one & ^
    echo two
    --- Output ---
    Test3
    one
    two
    
    echo Test4
    echo one ^
    & echo two
    --- Output ---
    Test4
    one & echo two
    

    要禁止转义下一个字符,可以使用重定向。

    重定向必须在插入符号之前。 但是在插入符号之前存在一个关于重定向的好奇心。

    如果在插入符号处放置一个标记,则该标记将被删除。

    echo Test5
    echo one <nul ^
    & echo two
    --- Output ---
    Test5
    one
    two
    
    
    echo Test6
    echo one <nul ThisTokenIsLost^
    & echo two
    --- Output ---
    Test6
    one
    two
    

    也有可能 嵌入换行符 在字符串中:

    setlocal EnableDelayedExpansion
    set text=This creates ^
    
    a line feed
    echo Test7: %text%
    echo Test8: !text!
    --- Output ---
    Test7: This creates
    Test8: This creates
    a line feed
    

    空行对成功很重要。这只适用于延迟扩展,否则在换行后将忽略行的其余部分。

    它工作,因为行尾的插入符号忽略下一个换行符并转义下一个字符,即使下一个字符也是换行符(在这个阶段回车总是被忽略)。

        3
  •  57
  •   community wiki 3 revs T.J. Crowder    7 年前

    (这基本上是对 Wayne's answer 但随着围绕着插入符号的混乱被清除。所以我把它贴成了CW。我不羞于编辑答案,但是 完全重写它们 似乎不合适。)

    可以用插入符号分隔长行( ^ ,只需记住插入符号和它后面的换行符 完全移除 从命令中,因此如果将它放在需要空格的位置(例如参数之间),请确保也包括空格(在 ^ 或者在下一行的开头——后一个选择可能有助于更清楚地表明它是一个延续)。

    实例: (所有测试都在Windows XP和Windows 7上进行)

    xcopy file1.txt file2.txt
    

    可以写为:

    xcopy^
     file1.txt^
     file2.txt
    

    xcopy ^
    file1.txt ^
    file2.txt
    

    甚至

    xc^
    opy ^
    file1.txt ^
    file2.txt
    

    (最后一个是有效的,因为 xc 以及 ^ ,并且在下一行的开头没有空格。所以当你移除 ^ 换行时,你会… xcopy )

    对于可读性和理智性,最好只在参数之间进行拆分(一定要包括空格)。

    确保 ^ 批处理文件中的最后一件事 appears to be a major issue with that .

        4
  •  13
  •   Todd Partridge    8 年前

    多个命令可以放在括号中,并分布在许多行上;因此 echo hi && echo hello 可以这样写:

    ( echo hi
      echo hello )
    

    变量也有助于:

    set AFILEPATH="C:\SOME\LONG\PATH\TO\A\FILE"
    if exist %AFILEPATH% (
      start "" /b %AFILEPATH% -option C:\PATH\TO\SETTING...
    ) else (
    ...
    

    我也注意到了插入符号( ^ ) if 条件值希望只有在存在空格的情况下才遵循这些条件:

    if exist ^
    
        5
  •  8
  •   Mohammed Safwat    10 年前

    然而,似乎在for循环的值中间拆分不需要插入符号(实际上尝试使用插入符号将被视为语法错误)。例如,

    for %n in (hello
    bye) do echo %n
    

    请注意,在“你好”或“再见”之前甚至不需要空格。