防止Powershell在文件末尾添加换行符。
防止Powershell在文件末尾添加换行符。
我需要替换几个子文件夹中的HTML实体,所以我使用了这里建议的PowerShell脚本:https://stackoverflow.com/a/2837891
然而,该脚本会在文件末尾添加一个额外的换行符,我想避免这种情况。在该线程的下一个评论中,列出了另一个脚本(https://stackoverflow.com/a/2837887),它应该可以实现我所需的功能,但我尝试运行时它并没有起作用。
以下是我的脚本:
$configFiles = Get-ChildItem . *.xml -rec foreach ($file in $configFiles) { (Get-Content $file.PSPath) | Foreach-Object { $_ -replace ' 8211;','–' } | Foreach-Object { $_ -replace ' 160;',' ' } | Foreach-Object { $_ -replace ' 8221;','”' } | Set-Content $file.PSPath }
我只需要它在末尾不再添加新行。
提前谢谢!
Prevent PowerShell from adding new line at the end of file
PowerShell中如何防止在文件末尾添加换行符
在PowerShell v5+中,使用Set-Content cmdlet(以及Add-Content和Out-File)支持-NoNewline开关。如果您使用的是较早版本,您必须直接使用.NET Framework,就像您链接到的一个答案中所演示的那样。
注意:-NoNewline不仅意味着省略了尾部换行符,而且还意味着所有输入对象直接连接在一起,没有分隔符(也没有添加尾部换行符)。
如果您的输入是一个多行字符串,-NoNewline将按预期工作。但是,如果您有一个字符串数组,您希望使用换行符将它们写入,并且不添加尾部换行符,那么您需要这样做:
(('one', 'two', 'three') -join "`n") + "`n" | Set-Content -NoNewline $filePath
此外还有:
没有必要多次调用ForEach-Object或者使用foreach语句;您可以在一个管道中完成所有操作(PSv3+,因为Get-Content -Raw,但是可以省略-Raw以在PSv2中以效率较低的方式工作):
Get-ChildItem . *.xml -Recurse |
ForEach-Object {
$filePath = $_.FullName
(Get-Content -Raw $filePath) -replace '&# 8211;', '–' `
-replace '&# 160;', ' ' `
-replace '&# 8221;', '”' |
Set-Content -NoNewline $filePath
}
可选阅读:
TheMadTechnician指出,在ForEach-Object调用的脚本块内为变量$filePath定义一个引用当前输入文件的完整路径的替代方法是使用常见参数-PipelineVariable(-pv):
Get-ChildItem . *.xml -Recurse -PipelineVariable ThisFile |
ForEach-Object {
(Get-Content -Raw $ThisFile.FullName) -replace '&# 8211;', '–' `
-replace '&# 160;', ' ' `
-replace '&# 8221;', '”' |
Set-Content -NoNewline $ThisFile.FullName
}
请注意,传递给PipelineVariable的参数不能带有$前缀,因为它是要绑定的变量的名称。
ThisFile随后在所有后续的管道段中引用Get-ChildItem的当前输出对象。
虽然在这个特定情况下并没有太多的收益,但使用-PipelinVariable的一般优势是以这种方式绑定的变量可以在任何后续的管道段中引用。