繁体   English   中英

如何在Powershell v2中正确转义引号?

[英]How to properly escape quotes in powershell v2?

如何正确地在Powershell v2中转义引号(从批处理文件中调用)?

我努力了:

powershell -Command "(gc file1.txt) -join "`n" | Out-File file2.txt"

powershell -Command "(gc file1.txt) -join ""`n"" | Out-File file2.txt"

powershell -Command "(gc file1.txt) -join '"`n`" | Out-File file2.txt"

但他们都失败了。

编者注 :该命令的目的是将Windows CRLF换行符转换为仅Unix LF换行符,以便创建将在Linux上处理的文件。

在批处理文件( cmd.exe )中,您必须\\转义嵌入式"实例 (即使PowerShell- 内部` (反引号)作为转义字符):

正如wOxxOm在对该问题的评论中指出的那样, 也可以选择使用"""嵌入一​​个单独的"
但是,考虑到大多数命令行实用程序都支持\\"\\"更容易记住。

powershell -Command "(gc file1.txt) -join \"`n\" | Set-Content -NoNewLine file2.txt"

注意:

  • Set-Content -NoNewline需要PSv5 +

  • Set-Content默认情况下会写入“ ANSI”编码的文件 (例如,基于美国英语系统上的代码页Windows-1252); 使用-Encoding参数进行更改。

    • 由于仅处理字符串 ,因此Set-Content优于Out-File ,仅当您具有必须先应用PowerShell默认格式的非字符串对象时才需要使用Set-Content
  • 考虑使用powershell -NoProfile ...抑制PowerShell的配置文件的加载,以便更快地执行和更可预测的执行环境。


PSv2解决方案:

不幸的是,在PSv5之前,只有Write-Host cmdlet支持-NoNewline参数(在v2中引入),此处没有帮助,因此必须使用.NET框架:

powershell -Command "[IO.File]::WriteAllText(\"$PWD/file2.txt\", ((gc $PWD/file1.txt) -join \"`n\") + \"`n\")"

请注意,需要显式使用路径前缀$PWD ,因为.NET Framework的当前目录通常与PowerShell的目录不同。

同样,输出文件的编码为UTF-8,没有BOM ,但是您可以将不同的编码作为第三个参数传递给[IO.File]::WriteAllText() ,例如[System.Text.Encoding]::Default [IO.File]::WriteAllText() [System.Text.Encoding]::Default以匹配Set-Content的默认行为(从Windows PowerShell v5.1开始)。


可选阅读:特定于平台的换行符"`n""`r`n"[Environment]::Newline

换行的隐式选择 (换行符):

  • 阅读时 ,PowerShell可以互换地接受纯LF(Unix风格)和CRLF(Windows风格)换行符(换行符)。

  • 编写时 (例如,将行/对象的数组发送到具有> / Out-File / Set-Content Out-File ),PowerShell使用适合平台的换行符序列。
    但是请注意, 嵌入在给定字符串输入对象中的所有换行序列均按原样发送到文件。

至于转义序列/常量

  • [Environment]::Newline包含适合平台的换行符。

  • "`n" 始终只是LF( \\n

    • "`n".Length返回1[char] 10 -eq [char] "`n"返回$True10是LF的十进制Unicode / ASCII码点)。

    • 该文档并未对此进行明确Get-Help about_Special_Characters提及“换行”和“换行”,但未提及所代表的特定字符[序列]。 (如前所述,LF本身与PowerShell中的CRLF一样,是有效的换行符)。

  • 因此,要创建CRLF序列,必须使用"`r`n"

至于脚本中的多行字符串文字 (包括here-documents):

  • 它们反映了源文件的换行样式 也就是说,如果您的脚本使用CRLF换行符,则换行符也将嵌入多行字符串中。

这是从PowerShell命令行执行此操作的一种方法:

(Get-Content Input.txt -Raw) -replace "`r`n","`n" | Out-File Output.txt -Encoding ASCII -NoNewline

正如其他人指出的那样,这是PowerShell v5解决方案( -Raw出现在v3中, -NoNewline出现在v5中)。

这是同一件事的PowerShell v2版本:

$content = [IO.File]::ReadAllText("C:\Path\Input.txt") -replace "`r`n","`n"
[IO.File]::WriteAllText("C:\Path\Output.txt", $content)

(因为.NET方法不使用PowerShell的“当前位置”,所以需要这些路径。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM