2017-04-13 43 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的優點是所束縛這樣可以在任何隨後管道段中引用的變量。