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

时间:2017-04-13 22:09:54

标签: powershell newline

我需要替换几个子文件夹中的文件中的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
}

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

提前谢谢!

1 个答案:

答案 0 :(得分:7)

PowerShell v5 + 支持使用-NoNewline cmdlet(以及Set-ContentAdd-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是可以在任何后续管道段中引用以这种方式绑定的变量。