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

时间:2017-06-19 18:02:24

标签: powershell batch-file windows-7 escaping powershell-v2.0

如何在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操作系统。

2 个答案:

答案 0 :(得分:3)

从批处理文件(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默认格式的非字符串对象时才需要powershell -NoProfile ...首先适用于他们。
  • 考虑使用Write-Host来禁止加载PowerShell的配置文件,以便更快地执行和更可预测的执行环境。

PSv2解决方案:

不幸的是,在PSv5之前,只有-NoNewline cmdlet支持powershell -Command "[IO.File]::WriteAllText(\"$PWD/file2.txt\", ((gc $PWD/file1.txt) -join \"`n\") + \"`n\")" 参数(在v2中引入),这在这里没有用,所以必须使用.NET框架:

$PWD

请注意需要显式使用路径前缀[IO.File]::WriteAllText(),因为.NET Framework的当前目录通常与PowerShell不同。

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

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

隐含选择新行(换行符):

  • 读取时,PowerShell接受仅LF(Unix风格)和CRLF(Windows风格)换行符(换行符)可互换

  • 时(例如,将数组的行/对象发送到包含> / Out-File / {的文件时{1}}),PowerShell使用平台相应的换行符序列 但请注意,给定字符串输入对象中的任何新行序列 embedded 都会按原样发送到文件。

至于转义序列/常量

  • Set-Content包含适合平台的换行符。

  • [Environment]::Newline 总是只是LF("`n"

    • \n返回"`n".Length1返回[char] 10 -eq [char] "`n"$True是LF的十进制Unicode / ASCII代码点)证明了这一点。

    • 文档没有明确说明:Get-Help about_Special_Characters提到“新行”和“换行符”,没有提到代表什么特定字符[序列]。 (如上所述,LF本身就像在PowerShell中的CRLF一样有效的换行符。)

  • 因此,要创建 CRLF 序列,您必须使用10

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

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

答案 1 :(得分:2)

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

"{\"currency\": [{\"USD\": [\"U.S.Dollar\",\"$\"]},]}"; or
"{\"currency\": [{\"USD\": [\"U.S.Dollar\",\"$\"]},\"USD\":[]]}";

正如其他人所说,这是一个PowerShell v5解决方案((Get-Content Input.txt -Raw) -replace "`r`n","`n" | Out-File Output.txt -Encoding ASCII -NoNewline 出现在v3中,-Raw出现在v5中。

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

-NoNewline

(路径是必需的,因为.NET方法不使用PowerShell"当前位置"。)