防止Powershell在文件末尾添加新行

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)

我需要做的就是不要在最后添加新行.

先感谢您!

mkl*_*nt0 7

PowerShell v5 +支持-NoNewlineSet-Contentcmdlet 的交换机(以及Add-ContentOut-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是可以在任何后续管道段中引用以这种方式绑定的变量.