Powershell 中换行符的 `r`n 和 `n 有什么区别?

Sim*_*nho 5 powershell newline line-breaks

我知道windows和unix中有不同的换行代码。但在 Powershell 中, 和 都`r`n用于`n换行。是否有从`n到 的自动转换`r`n?为什么必须使用引号而不是反斜杠?

mkl*_*nt0 6

  • 输入时,PowerShell 可以互换地`r`n接受(Windows 风格)和`n(Unix 风格)以及 换行符 ,无论其运行的平台 (OS) 为何;这既适用于读取 PowerShell 源代码文件(例如*.ps1脚本),也适用于读取文本(特别是Get-Content.

    • `n是 LF,换行符U+000A,在类 Unix 平台本身用作换行符。

    • `r`n是 CRLF,换行符序列,由一个 CARRIAGE RETURN () 字符紧跟一个 LF 组成,在WindowsU+000D上用作换行符。

    • `上面使用了,因为它是`引号(正式称为 GRAVE ACCENT,U+0060) ,在 PowerShell 中充当转义字符,与许多其他语言不同,它在其中\(例如,`n在 PowerShell 中对应于\nC# 和 JavaScript,并。`r`n\r\n

      • `用作 PowerShell 中的转义字符:

        • 在可扩展字符串内部("...";但不在内部,其内容逐字'...'使用) 否
        • 在传递给命令的不带引号的参数中,其主要目的是转义元字符(例如;具有语法功能的字符),即逐字使用它们;例如,Write-Host a`;b
        • 有关详细信息和支持的转义序列列表,请参阅概念性about_Special_Characters帮助主题。
      • 请注意,在正则表达式上下文中(例如通过-match-replace运算符),\基于 的转义序列(例如\n)仍然可以发挥作用,即当这些转义序列由.NET 正则表达式引擎而不是 PowerShell 本身解释时(例如"a`nb" -replace '\n'产量'ab');请参阅概念性about_Regular_Expressions帮助主题。

  • 输出中,PowerShell 使用平台本机换行序列:`r`n在 Windows 上、`n在类 Unix 平台上。

    • 这适用于使用创建文本文件的 cmdlet,其中包括:

      • 用于创建纯文本文件的Cmdlet :Set-ContentOut-File/ 重定向运算符>
      • 创建结构化文本文件的 Cmdlet,例如Export-Csv.
    • 作为旁白:

      • PowerShell [Core] 6+中,创建(和读取)文本文件时一致使用的字符编码是UTF-8 without a BOM

      • 相比之下,在Windows PowerShell(PowerShell 版本高达 5.1)中,默认编码因 cmdlet 而异,并且通过输出 cmdlet 的参数选择 UTF-8总是会创建带有BOM的-Encoding文件。

      • 有关 Windows PowerShell 与 PowerShell [Core] 中(默认)字符编码的更多信息,请参阅此答案


至于你的具体问题

是否有从到 的自动转换`n`r`n

从某种意义上来说,是的:

使用文本文件创建 cmdlet 保存到文件会隐式使用平台本机换行序列,如上所述。

因此,读取文件(默认情况下逐行Get-Content读取文件)并将这些行保存回文件中将有效地导致原始换行符转换为平台本机换行符(如果原始换行符来自相应的换行符)另一个世界。Set-Content

请注意,字符编码可能会单独更改,因为一旦将字符串读入内存,有关输入文件字符编码的信息就会丢失,并且创建文本文件的 cmdlet(例如在输出上Set-Content应用其默认编码) - 请参阅此答案了解背景信息。

无论您在哪个平台上运行,有针对性地转换为特定的换行符样式都需要更多的工作。

为什么必须使用反引号(`而不是反斜杠(\)?

\因为转义字符对于 PowerShell 来说是一个糟糕的选择,因为在文件路径\中使用,考虑到它\充当 Windows 上的(主要)文件系统路径分隔符,并且考虑到将文件路径作为参数传递是一个非常常见的用例在贝壳里。

必须对\这些路径分隔符进行转义以消除它们的歧义,\因为转义字符(例如,"C:\\Program Files\\PowerShell"而不是"C:\Program Files\PowerShell")将是一种过度的负担(这种转义在 C# 和 JavaScript 等编程语言中已经足够烦人了,尽管最近的版本现在提供了替代语法形式不需要转义的地方)。

因此,PowerShell 需要一个不同的转义字符,并选择了`,因为:

  • 它在字面用途中很少见;也就是说,您很少需要转义`它本身 - as ``- 才能逐字使用它。

  • 至少在英文键盘上,很容易输入。

其他外壳

  • cmd.exe太必须选择不同的转义字符,并选择^插入符号(正式名称为 CIRCUMFLEX ACCENT,U+005E)。

  • 类似 POSIX 的 shell(例如 Bash)从未遇到过这个问题,因为Unix 文件系统路径中的分隔符是 ,而/不是;\因此,像大多数编程语言一样,这些 shell 用作\转义字符。

  • 很好的答案,大量有用的信息⭐ (2认同)
  • 我很高兴听到它很有用,@Prid,并且我很感谢您的良好反馈。 (2认同)

The*_*le1 1

如果您正在谈论脚本,PowerShell 在解析时将同等地解释行\n\r\n(EOL) 序列。EOL\r\n主要是过去的 Windows 工件,大多数发布的现代(大约 2018 年)Windows 应用程序都会对它们进行相同的解释。

这些不是引号,而是重音符号反引号(大多数键盘上的波形键),它们是 PowerShell 中指定的字符串转义字符。

影响Windows PowerShell 脚本解析的一件事是字节顺序标记 (BOM) 的使用。这是让 PowerShell 解释器在代码中查看 unicode(例如表情符号)的唯一方法;即使用 UTF8-BOM。