我需要替换几个子文件夹中的文件中的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
}
我需要做的就是不要在最后添加新行。
提前谢谢!
答案 0 :(得分:7)
PowerShell v5 + 支持使用-NoNewline
cmdlet(以及Set-Content
和Add-Content
)的Out-File
开关。
如果您正在运行早期版本,则必须直接使用.NET Framework,如one of the answers you link to中所示。
警告:-NoNewline
并不仅仅意味着省略尾随换行符,而是所有输入对象是直接连接,没有分隔符(并且没有添加尾随换行符)。
如果您的输入是单个多行字符串,如下所示,-NoNewLine
将按预期工作,但如果您有一个数组字符串,则只需使用换行符 他们而不是尾随,你必须做的事情如下:
(('one', 'two', 'three') -join "`n") + "`n" | Set-Content -NoNewLine $filePath
)。
另见:我的this answer。
顺便说一句:不需要多次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指出定义变量$filePath
的替代方法是在ForEach-Object
调用的脚本块内引用输入文件的完整路径 是使用通用参数-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
}
注意传递给PipelinVariable
的参数必须不具有$
前缀,因为它是要绑定的变量的名称。
$ThisFile
然后在所有后续管道段中引用Get-ChildItem
的当前输出对象。
虽然在这种特殊情况下没有太大的收获,但使用
的一般优势
-PipelinVariable
是可以在任何后续管道段中引用以这种方式绑定的变量。