2016-05-24 58 views
1

我檢查文件中缺少特殊位置的char的行。如果缺少字符,我將它插入到確切的位置。現在我想用舊行中的那個額外字符將新行寫入文件。Powershell - 替換一些行

"C:\\path\test\test" 
"C:\\path\test\test2\" 
"C:\\path\test\test3\" 

我跑我的短劇本後,我希望它看起來像:

"C:\path\test\test\" 
"C:\path\test\test2\" 
"C:\path\test\test3\" 

我盡力去完成,使用這個小環:比如我已在該文件中以下

$content = Get-Content C:\path\to\file.txt 
foreach ($line in $content) 
{ 
    if($line[-25] -ne '\') { 
     $test = $line -replace '(?<!\\)(?=.{24}$)', '\' | Set-Content C:\path\to\file.txt 
    } 
    else { 
     continue 
    } 
} 

該代碼不會插入我在正確位置的字符。但最後只有一行在文件中,而不是全部三行。 我覺得我很接近,但剛剛開始使用PowerShell。

回答

2

Set-Content用輸入值替換文件中的所有內容。你在循環的每次迭代中獨立地調用它,當你真正想要的是用循環的所有結果調用它。

有很多方法去改變它,但我會考慮更換ForEach-Objectforeach和管道結果到Set-Content

Get-Content C:\path\to\file.txt | 
ForEach-Object -Process { 
    $line = $_ 
    if($line[-25] -ne '\') { 
     $line -replace '(?<!\\)(?=.{24}$)', '\' 
    } else { 
     $line 
    } 
} | Set-Content C:\path\to\file.txt 
+1

謝謝,完美的作品!對於可能有類似問題的其他人,將'Get-Content C:\ path \ to \ file.txt'放在方括號內(Get-Content C:\ path \ to \ file.txt)'。否則,Set-Content無法訪問該文件,因爲它仍然由Get-Content使用。 – BallerNacken

+2

@BallerNacken好點;你也可以寫一個單獨的文件,這將做到這一點。 – briantist

2

由於@briantist所指出的,你需要移動以外的Set-Content爲循環來一次設置整個文件。但是,在for循環中,不需要字符計數。我發現最好使用系統API來處理路徑,而不是嘗試編寫正則表達式。

Get-Content $inputFileName | Foreach-Object { 
    # Strip quotes 
    $line = $_ -replace '"','' 

    # Add trailing backslash if needed 
    $line += '\' 

    # Call .NET GetFullPath to normalize. This removes double backslashes 
    # and resolves relative paths if needed. 
    $line = [System.IO.Path]::GetFullPath($line) 

    # Add quotes back, and output string 
    '"' + $line + '"' 
} | Set-Content $outputFileName 

或者,在很多簡明的形式

gc $inputFile | % { [io.path]::GetFullPath((($_+'\') -replace '"','')) } | sc $outputFile 
+0

我接受了briantists的回答,但會考慮你的並測試它。謝謝! – BallerNacken

+0

@BallerNacken你絕對應該考慮使用路徑函數和cmdlet('Split-Path','Join-Path'),而不是你之前做的事情。 – briantist