代码之家  ›  专栏  ›  技术社区  ›  Brian R. Bondy

如何在批处理文件中回显换行符?

  •  552
  • Brian R. Bondy  · 技术社区  · 16 年前

    如何从批处理文件输出中插入换行符?

    我想做如下的事情:

    echo hello\nworld
    

    将输出:

    hello
    world
    
    18 回复  |  直到 6 年前
        1
  •  415
  •   Gerhard    7 年前

    echo hello & echo.world

    这意味着你可以定义 & echo. 作为换行符的常量 \n .

        2
  •  489
  •   Peter Mortensen icecrime    8 年前

    用途:

    echo hello
    echo.
    echo world
    
        3
  •  122
  •   jeb    7 年前

    接下来,创建一个包含以下内容的.bat文件:

    @echo off
    REM Creating a Newline variable (the two blank lines are required!)
    set NLM=^
    
    
    set NL=^^^%NLM%%NLM%^%NLM%%NLM%
    REM Example Usage:
    echo There should be a newline%NL%inserted here.
    
    echo.
    pause
    

    您应该看到如下输出:

    There should be a newline
    inserted here.
    
    Press any key to continue . . .
    

    显然,您只需要REM语句之间的代码。

        4
  •  92
  •   macropas    15 年前

    有一个标准功能 echo: 在cmd/bat文件中写入空行,这模拟了cmd输出中的新行:

    @echo off
    @echo line1
    @echo:
    @echo line2
    

    上面引用的命令文件的输出:

    line1
    
    line2
    
        5
  •  56
  •   Community CDub    8 年前

    就像肯的回答一样,但是用了延迟的扩展。

    setlocal EnableDelayedExpansion
    (set \n=^
    %=Do not remove this line=%
    )
    
    echo Line1!\n!Line2
    echo Works also with quotes "!\n!line2"
    

    首先创建一个换行符并将其分配给\n变量。
    这可以作为行尾的插入符号尝试转义下一个字符,但如果这是换行符,则忽略它,并读取和转义下一个字符(即使这也是换行符)。
    然后需要第三行提要来结束当前指令,否则第三行将附加到LF变量。
    即使批处理文件也有CR/LF的行尾,只有LF是重要的,因为CR在解析器的这个阶段被删除。

    使用延迟扩展的好处是,根本没有特殊的字符处理。
    echo Line1%LF%Line2 将失败,因为解析器在单个换行处停止解析。

    更多的解释在
    SO:Long commands split over multiple lines in Vista/DOS batch (.bat) file
    SO:How does the Windows Command Interpreter (CMD.EXE) parse scripts?

    编辑:避免 echo.

    这不能回答问题,因为问题是关于单身 echo 可以输出多行。

    但尽管有其他答案,谁建议使用 回声。 要创建新行,应注意 回声。 是最糟糕的,因为它非常慢,而且可能完全失败,因为cmd.exe搜索一个名为 ECHO 试着启动它。

    如果只打印空行,可以使用

    echo,
    echo;
    echo(
    echo/
    echo+
    echo=
    

    而是使用 回声。 , echo\ echo: 应该避免,因为它们可能非常慢,这取决于脚本的执行位置,比如网络驱动器。

        6
  •  35
  •   coltonon    9 年前

    echo. 说得够多了。

    如果您需要一行,请使用 & . 例如,

    echo Line 1 & echo. & echo line 3
    

    将输出为:

    Line 1
    
    line 3
    

    现在,假设你想要更高级的东西,…

    set n=^&echo.
    echo hello %n% world
    

    输出

    hello
    world
    

    那就扔一个 %n% 无论何时在echo语句中需要新行。这更接近你的 \n 用于各种语言。

    击穿

    set n= 设置变量 n 等于:

    ^ 将要跟随的下一个符号为空:

    & 意思是在同一行上执行另一个命令。我们不关心错误级别(它是一个回声声明,因为它大声呼喊),所以不。 && 是需要的。

    回声。 继续echo语句。

    所有这些都可以工作,因为您实际上可以创建代码变量,并在其他命令中使用它们。它有点像犹太人区函数,因为批处理并不是最先进的shell脚本语言。这仅仅是因为批处理对变量的使用很差,不自然地在ints、chars、float、strings等之间指定。

    如果你很狡猾,你可以让它和其他东西一起工作。例如,使用它来回送选项卡

    set t=^&echo.     ::there are spaces up to the double colon
    
        7
  •  19
  •   Reci    15 年前

    当回送某些东西以重定向到一个文件时,多个回送命令将不起作用。我认为“重定向器”可能是一个不错的选择:

    echo hello > temp
    echo world >> temp
    
        8
  •  15
  •   Peter Mortensen icecrime    9 年前

    就像格里姆特隆建议的那样-这里有一个简单的例子来定义它:

    @echo off
    set newline=^& echo.
    echo hello %newline%world
    

    产量

    C:\>test.bat
    hello
    world
    
        9
  •  13
  •   test30    10 年前

    如果需要将结果放到文件中,可以使用

    (echo a & echo. & echo b) > file_containing_multiple_lines.txt
    
        10
  •  9
  •   albert    13 年前

    你也可以这样做,

    (for %i in (a b "c d") do @echo %~i)
    

    输出将为,

    a
    b
    c d
    

    请注意,如果将其放入批处理文件中,则“%”应加倍。

    (for %%i in (a b "c d") do @echo %%~i)
    
        11
  •  6
  •   Wayne Uroda    12 年前

    如果有人来这里是因为他们想从一个名为makefile的文件中回音一个空白行,我用

    @cmd /c echo.

    简单使用 echo. 引起恐惧 process_begin: CreateProcess(NULL, echo., ...) failed. 错误信息。

    我希望这至少能帮助其他人:)

        12
  •  3
  •   PryroTech    8 年前

    要批量启动新行,只需添加“echo[”,如下所示:

    echo Hi!
    echo[
    echo Hello!
    
        13
  •  2
  •   djangofan    11 年前

    这对我有效,不需要延迟扩张:

    @echo off
    (
    echo ^<html^> 
    echo ^<body^>
    echo Hello
    echo ^</body^>
    echo ^</html^>
    )
    pause
    

    它写输出如下:

    <html>
    <body>
    Hello
    </body>
    </html>
    Press any key to continue . . .
    
        14
  •  2
  •   Peter Mortensen icecrime    8 年前

    Ken和Jeb解决方案工作得很好。

    但是新行只生成一个LF字符,我需要CRLF字符(Windows版本)。

    为此,在脚本末尾,我已经将lf转换为crlf。

    例子:

    TYPE file.txt | FIND "" /V > file_win.txt
    del file.txt
    rename file_win.txt file.txt
    
        15
  •  1
  •   Tomator    7 年前

    如果需要在可以传递给变量的字符串中使用著名的\n文本,可以编写类似于 蝙蝠 脚本如下:

    @echo off
    set input=%1
    if defined input (
        set answer=Hi!\nWhy did you call me a %input%?
    ) else (
        set answer=Hi!\nHow are you?\nWe are friends, you know?\nYou can call me by name.
    )
    
    setlocal enableDelayedExpansion
    set newline=^
    
    
    rem Two empty lines above are essential
    echo %answer:\n=!newline!%
    

    这样,多行输出可以在一个地方准备,甚至在其他脚本或外部文件中,并在另一个地方打印。

    换行符保留在 换行符 变量。它的值必须被替换 之后 这个 回声 行已扩展,因此我使用 设置本地启用延迟扩展 启用在执行时扩展变量的感叹号。执行替代品 \n 具有 换行符 内容(查找语法 帮助集 )我们当然可以用 !换行! 在设置 回答 但是 \n 更方便。它可能是从外面传来的(试试看 你好,R2\ND2 ,其中没有人知道保存换行符的变量名(是, 你好C3!换行!P0 工作原理相同)。

    上面的示例可以细化为子例程或独立批处理,如下所示 call:mlecho Hi\nI'm your comuter :

    :mlecho
    setlocal enableDelayedExpansion
    set text=%*
    set nl=^
    
    
    echo %text:\n=!nl!%
    goto:eof
    

    请注意,附加反斜杠不会阻止脚本分析子字符串。

        16
  •  0
  •   johan d    12 年前

    你可以使用 @echo (@echo+[空间]+[嵌入空间])

    注:用alt+0160可获得嵌入空间

    希望有帮助:)

    [编辑]嗯,你是对的,我需要它在makefile中,它在那里工作得很好。我想我的答案不适合批处理文件…我的错。

        17
  •  -1
  •   Peter Mortensen icecrime    9 年前

    我不能让它简单到:

    echo echo hello^&echo world^&pause>silly.bat                       
    call silly.bat
    
        18
  •  -3
  •   user669132    6 年前

    在Linux系统中实现这一点的最保守的方法是 -e 别名-解释反斜杠转义字符。

    echo -e "hello\nworld"
    

    这里还有其他 examples