2015-11-25 37 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 
      } 

     }