gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 00:28:28 25 4
gpt4 key购买 nike

您如何正确转义 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-only 换行符,从而创建将在 Linux 上处理的文件。

最佳答案

从批处理文件 ( cmd.exe ),您必须 \ -escape嵌入"实例
(即使 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 的默认格式时才需要。
  • 考虑使用 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匹配 Set-Content的默认行为(从 Windows PowerShell v5.1 开始)。

    可选阅读:特定于平台的换行符 "`n"对比 "`r`n"对比 [Environment]::Newline
    换行的隐式选择 (换行):
  • 读取时,PowerShell 接受 LF-only(Unix 风格)和 CRLF(Windows 风格)换行符(换行符)。
  • 写入时(例如,当使用 >/Out-File/Set-Content 将行/对象数组发送到文件时),PowerShell 使用适合平台的换行序列。
    但是请注意,嵌入给定字符串输入对象的任何换行序列都按原样发送到文件。

  • 至于 转义序列/常量 :
  • [Environment]::Newline包含适合平台的换行符。
  • "`n"始终只是 LF ( \n )
  • 正如 "`n".Length 所证明的那样返回 1[char] 10 -eq [char] "`n"返回 $True ( 10 是 LF 的十进制 Unicode/ASCII 代码点)。
  • 文档对此没有明确说明: Get-Help about_Special_Characters 提到“换行”和“换行”,没有提到代表什么特定字符[序列]。 (如前所述,LF 本身与 CRLF 在 PowerShell 中一样有效的换行符)。
  • 因此,要创建 CRLF 序列,您必须使用 "`r`n" .

  • 至于 脚本中的多行字符串文字 (包括此处的文件):
  • 它们反射(reflect)了源文件的换行样式。也就是说,如果您的脚本使用 CRLF 换行符,那么嵌入在多行字符串中的换行符也将使用 CRLF 换行符。
  • 关于powershell - 如何在powershell v2中正确转义引号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44637110/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com