2017-04-13 37 views
3

的末尾添加新行,我需要更换几个子文件夹中的文件的HTML实体,所以我用PowerShell脚本这里建议:https://stackoverflow.com/a/2837891防止PowerShell与在文件

然而,脚本增加了一个额外的新行文件的结尾,我想避免这种情况。在该线程的下一条评论(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 
} 

所有我需要做的是它不能被添加在最后一个新行。

预先感谢您!

回答

6

PowerShell的V5 +支持-NoNewline开关与Set-Content小命令(以及Add-ContentOut-File)。

如果您运行的是早期版本,则必须直接使用.NET Framework,如one of the answers you link to中所示。

买者-NoNewline并不仅仅意味着一个尾随换行符被省略,但所有输入对象是直接级联,不使用隔离(和不添加尾随换行)。
如果你输入一个多行字符串,如下面,-NoNewLine将如预期,但如果你有一个字符串阵列你想换行他们之间只写和不也是尾随一,你将不得不这样做:
('one', 'two', 'three') -join "`n" | Set-Content -NoNewLine $filePath)。
另请参阅:我的this answer


顺便说一句:有无需多ForEach-Object调用甚至foreach声明;你可以做到这一切在一个管道(PSv3 +,由于Get-Content -Raw,但你可以在PSV2省略-Raw,使其工作(效率较低)太):

Get-ChildItem . *.xml -Recurse | 
    ForEach-Object { 
    $filePath = $_.FullName 
    (Get-Content -Raw $filePath) -replace '&# 8211;', '–' ` 
     -replace '&# 160;', ' ' ` 
      -replace '&# 8221;', '”' | 
      Set-Content -NoNewline $filePath 
    } 

可选阅读:

TheMadTechnician指出以限定可变$filePath替代参考输入文件的完整路径手头的的脚本块内10呼叫是使用通用参数-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的优点是所束缚这样可以在任何随后管道段中引用的变量。