如何在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操作系统。
答案 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".Length
和1
返回[char] 10 -eq [char] "`n"
($True
是LF的十进制Unicode / ASCII代码点)证明了这一点。
文档没有明确说明:Get-Help about_Special_Characters
提到“新行”和“换行符”,没有提到代表什么特定字符[序列]。 (如上所述,LF本身就像在PowerShell中的CRLF一样有效的换行符。)
因此,要创建 CRLF 序列,您必须使用10
。
至于 脚本中的多行字符串文字 (包括here-documents):
答案 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"当前位置"。)