BN_*_*pdx 4 powershell newline
我需要替换几个子文件夹中的文件中的HTML实体,所以我使用了PowerShell脚本:https://stackoverflow.com/a/2837891
但是,该脚本在文件末尾添加了一个额外的新行,我想避免这种情况.在该线程的下一个评论中列出了另一个脚本(/sf/answers/198652121/),它本应该实现我所需要的,但是当我尝试运行它时它不起作用.
这是我的脚本:
$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
}
Run Code Online (Sandbox Code Playgroud)
我需要做的就是不要在最后添加新行.
先感谢您!
PowerShell v5 +支持-NoNewline带Set-Contentcmdlet 的交换机(以及Add-Content和Out-File).
如果您运行的是早期版本,则必须直接使用.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
}
Run Code Online (Sandbox Code Playgroud)
可选阅读:
TheMadTechnician指出,在调用的脚本块内定义变量$filePath以引用输入文件的完整路径的替代方法是使用common parameter ():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
}
Run Code Online (Sandbox Code Playgroud)
注意如何传递给参数PipelinVariable必须不能有$前缀的,因为它是名称绑定变量.
$ThisFile然后引用Get-ChildItem所有后续管道段中的当前输出对象.
虽然在这种特殊情况下没有太多的好处,但使用的一般优点
-PipelinVariable是可以在任何后续管道段中引用以这种方式绑定的变量.
| 归档时间: |
|
| 查看次数: |
1869 次 |
| 最近记录: |