![](/img/trans.png)
[英]How to use ANSI escape sequence color codes for PSReadLineOption v2 in Powershell console?
[英]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"
返回$True
( 10
是LF的十进制Unicode / ASCII码点)。
该文档并未对此进行明确Get-Help about_Special_Characters
提及“换行”和“换行”,但未提及所代表的特定字符[序列]。 (如前所述,LF本身与PowerShell中的CRLF一样,是有效的换行符)。
因此,要创建CRLF序列,必须使用"`r`n"
。
至于脚本中的多行字符串文字 (包括here-documents):
这是从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.