【问题标题】:Is it possible to put a new line character in an echo line in a batch file? [duplicate]是否可以在批处理文件的回显行中放置一个换行符? [复制]
【发布时间】:2010-12-15 19:53:44
【问题描述】:

是否可以在批处理文件的回显行中添加换行符?

基本上我希望能够做到以下几点:

echo Hello\nWorld

在 Linux 中你可以很容易地做到这一点,但我不知道如何在 Windows 中做到这一点。

【问题讨论】:

标签: windows batch-file


【解决方案1】:

我认为这是不可能的。您只能对此尝试使用 ascii 字符: http://www.asciitable.com/ 但这可能会使您的批处理文件崩溃。

【讨论】:

  • 是的,我试过了,可惜没用。
【解决方案2】:

哈哈哈,

我想我已经找到了足够接近的东西......

echo hello&echo.&echo world

生产:

你好

世界

【讨论】:

    【解决方案3】:

    经过一些实验后,我发现无需发出两个单独的回显命令就可以做到这一点,如How can you echo a newline in batch files? 中所述。但是,要使其正常工作,您需要一个不会将 CR 转换为 CR+LF 的文本编辑器。

    类型:

    @echo First Line
    

    然后在打开 NumLock 的情况下,按住 ALT 键并在数字小键盘上输入 10,然后再释放 ALT(您必须使用数字小键盘,而不是顶行的数字键)。这将插入一个 CR 字符。然后输入第二行。根据您的编辑器以及与 CR+LF 相比它处理 CR 的方式,您可能会得到:

    @echo First Line◙Second Line
    

    @echo First Line
    Second Line
    

    只要文本编辑器不将 CR 转换为 CR+LF(Windows/DOS 编辑器会这样做,除非您将它们配置为不这样做),这可以从命令行运行,并且可以在批处理文件中运行。如果 CR 转换为 CR+LF,或者如果您只使用 LF,则第二行将被解释为新命令。

    但是,我不明白为什么这比简单的更可取:

    @echo First Line
    @echo Second Line
    

    【讨论】:

    • 搞笑,我以为我试过了,但我又试了一次,它确实有效。
    • 我不知道您尝试了哪个操作系统,但您的解决方案无法运行,因为批处理解析器完全删除了 raw CR。在最好的情况下,CR 会将光标移回行首,而不是下一行
    • @jeb :这完全取决于命令外壳如何处理 CR。我在 Windows cmd.exe 中对其进行了测试(因为这就是问题的标记方式),正如 Benj 评论的那样,它对他有用。 cmd.exe 大概执行到 CR+LF 的转换。大多数终端仿真器将通过配置支持类似的翻译,但您是对的,该技术并不普遍适用 - 但这不是问题的提出方式。我仍然对为什么有人想要这样做感到困惑,但就是这样!
    • 我还假设了 windows(batch),但我只是重新测试了它,它不起作用,我用一个 CR(13) 和一个 LF(10) 字符进行了测试。正如我所说,我无法相信您的解决方案会奏效。 How does the CMD.EXE parse scripts? 点 1.5 和 2
    • 在 CLI [6.3.9600] 上运行良好,即使它在批处理文件中不起作用。 I remain bemused regarding why anyone would want to do this - 我有时使用它来使 %PATH% 变量易于阅读:echo %path:;=◙%
    【解决方案4】:

    echo. 打印一个空行。

    例子:

    echo Hello
    echo.
    echo world
    

    打印

    Hello
    
    world
    

    【讨论】:

    • echo.echo( 慢约 20 倍,当存在名称为 echo 且没有扩展名的文件时,它完全失败。所以echo(更安全更快
    • echo( 在 DOS 6.22 中不起作用。 (尽管目前这可能是最少的受众。)
    • @JimDavis +1 用于 DOS 6.22 兼容性
    • @jeb 您从哪里获得性能信息? echo[ 呢?
    • @Synetech 我用几千个回声测量了它。我没有测量echo[,但由于它也失败了一个名为echo[.bat的文件,它应该和echo.一样慢关于ECHO. FAILS to give text or blank line的回声变化的信息
    【解决方案5】:

    我发现这非常有用,因此想使用提供的答案发布一个更好的示例

    这提供了格式良好的使用信息

    if "%1" == """" goto usage
    
    :usage
     echo  USAGE: %0 [Set properties using -D flag] [Ant Task to Run]  &
     echo.                                                             &
     echo        Availble Command line properties                      &
     echo        --------------------------------                      &  
    ...
    

    【讨论】:

      【解决方案6】:

      一个回声就可以解决。

      为此,您需要一个换行符 \n。 有多种方法可以在 echo 中添加新行

      1) 此示例使用多行插入符号在命令中添加换行符,
      空行是必需的

      echo Hello^
      
      world
      

      2) 下一个解决方案首先创建一个包含一个换行符的变量。

      set \n=^
      
      
      rem ** Two empty lines are required
      

      或者用稍微修改的版本创建新行

      (set \n=^
      %=DONT REMOVE THIS=%
      )
      

      并将此字符与延迟扩展

      一起使用
      setlocal EnableDelayedExpansion
      echo Hello!\n!world
      

      要使用带有百分比扩展的换行符,您需要创建一个更复杂的序列

      echo Hello^%\n%%\n%world
      

      或者您可以使用New line hack

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

      但只有换行符的延迟扩展才可靠,引号内也是如此。

      【讨论】:

      • +1 把这个问题从坟墓里带回来;-)
      • +1,很高兴能够在立即(百分比)扩展的变量中使用换行符;但是,有没有办法以相同的方式扩展回车字符而不会延迟扩展?
      • @aschipfl 不,这是不可能的,因为所有回车符都在百分比扩展阶段之后被删除,并且没有办法逃避它们
      • 插入符号 (^) 在 MS-DOS 中不起作用,至少在 FreeDOS 中不起作用。似乎需要单独的 echo 命令,每行一个。
      • 是否可以仅将 回车符 \r 分配给变量?
      【解决方案7】:

      回声。 要么 回声(

      将做空白的新行。希望这会有所帮助。

      【讨论】:

      • 但这并没有回答如何在两个文本之间添加新行的问题。
      猜你喜欢
      • 2010-09-13
      • 2019-07-18
      • 1970-01-01
      • 2016-01-24
      • 2023-04-01
      • 1970-01-01
      • 2011-02-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多