嗨,我已经研究这个问题有一段时间了,但我尝试过的都没有效果。请原谅我再次问这个问题,但我无法在 powershell 中用空格替换新行
$path = "$root\$filename"
Get-Content $path | % $_.Replace "`r`n"," " | Set-Content "$root\bob.txt" -Force
这是我在这个网站上尝试过的众多事情之一。
我正在使用 powershell v3
这里有几个问题。 首先,按照您调用 Get-Content 的方式,沿着管道发送的字符串中永远不会有换行符。这是因为 Get-Content 的默认工作方式是在换行符上拆分文件并为每行输出一个字符串。 其次,您的 Foreach 命令需要在替换命令周围使用 {}。 试试这个:
Get-Content $path -Raw | Foreach {$_ -replace "`r`n",' '} |
Set-Content $root\bob.txt -Force
-Raw
参数指示Get-Content
将文件内容作为单个字符串读取。 这将保留 CRLFs
。
Keith Hill 的有用答案很好地解释了代码的问题并提供了可行的解决方案。
但是,Keith 的解决方案在输出行中添加了一个尾随空格(如果它有效的话,就像您自己的解决方案尝试所做的那样)。
这里有一个更简单的替代方案,可以避免此问题(请注意下面的字符编码警告):
(Get-Content $path) -join ' ' | Set-Content -Force $root\bob.txt
(Get-Content $path)
返回线的 array,
字符编码警告:您可能需要在上面的命令中传递-Encoding
参数...
BOM 的情况下,两个 PowerShell 版本使用不同默认值,不幸的是:
Windows PowerShell(旧版、随 Windows 一起提供、仅限 Windows 的 PowerShell 版本,其最新且最后一个版本为 5.1)默认为与活动旧系统区域设置(也称为语言)关联的 ANSI 代码页对于非 Unicode 程序),例如美式英语系统上的 Windows-1252,关于阅读源代码和 Get-Content
/ Set-Content
;不幸的是,其他 cmdlet,尤其是
Out-File
及其虚拟别名
>
,使用不同的默认值 - 有关详细信息,请参阅此答案
。
(现代、跨平台、按需安装的后继者)现在值得称赞的是,在所有 cmdlet 和读取源代码时,一致地默认为(无 BOM)UTF-8。
使用
-Encoding utf8
Set-Content
书写正确。 在使用
从中读取字符串的文件的原始编码永远不会保留;相反,在没有 Set-Content
参数的情况下应用的是 -Encoding
的默认编码;如前所述,Windows PowerShell
中的默认值是ANSI,PowerShell 7 中的默认值是无 BOM UTF-8。 UTF-8 的结果是:
$OFS
' '
(单个空格):
[string](Get-Content $path) | Set-Content -Force $root\bob.txt
或
"$(Get-Content $path)" | Set-Content -Force $root\bob.txt
$OFS
是一个自动变量,指定分隔符,该分隔符将用于分隔数组的元素,并将其强制转换为
[string]
。 它的默认值为空格,
Get-Content
将返回文件中行的数组,删除 CRLF。将其转换为 [string]
然后会在文件中生成一个以空格分隔的行字符串。试试这个: