2015-11-25 44 views
0
$x = Get-Content($file) 
if ($x -match("~")) { 
    $x -replace("~","~`n") | Out-File $file 
} 

這是我正在使用的代碼片段。我已經調試到這一點,並且在我用自己替換字符tilda ~然後創建一個新行後代碼沒有更新。當我輸出它到命令窗口並註釋掉| Out-File $file代碼工作正常。當我嘗試將新結果傳回原始文件時,代碼不會「解開」文件。管道替換爲新文件

+0

順便說$文件的文件路徑位置,如:你能後的文本文件的樣本/dir1/dir2/foo.txt – UserX

+0

:C? – ConanW

+0

Sure Conan,它會是這樣的:Line1 * Item1 * Item2〜Line2 * Item3 * Item4〜Line3 * Item5 * Item6〜 – UserX

回答

2

更換工作得很好。但是,您只插入了換行字符(LF,`n),而不是Windows用於編碼換行符的回車換行和換行符(CR-LF,`r`n)的組合。因此,在記事本中打開文件時看不到換行符。 PowerShell同時接受LF和CR-LF作爲換行符編碼,因此當您在那裏輸出文件時,您會看到正確包裝的行。

你的代碼改成這樣,你會得到預期的結果:

(Get-Content $file) -replace '~', "~`r`n" | Set-Content $file 
+0

謝謝Ansgar,我實際上是使用echo在命令窗口中檢查結果。愚蠢的修復我的結局。謝謝你的回答! Upvoted有用。 – UserX

0

我的錯。我上面打電話給讀者方法。

ForEach ($file in $Path){ 
    $Array = @() 
    $reader = new-object System.IO.StreamReader($file) 

我需要一個數組來確定文件是否需要解包才能開始。如果內容佔用1行,則需要解包。如果不是,那麼它沒有。我基本上使用了streamreader,它將把每行存儲爲數組中的一個元素。我之前忘記關閉$ reader,所以我們有生產者 - 消費者問題,因此Out-File無法覆蓋$ file。

固定段:

if($Array.length -eq 1){ 
     $x = Get-Content($file) 

     if($x -match("~")){ 
      $reader.close() 
      ($x -replace("~","~`n")) | Out-File $file 
      } 

     }