管道替换为新文件

时间:2015-11-25 16:22:02

标签: powershell

$x = Get-Content($file)
if ($x -match("~")) {
  $x -replace("~","~`n") | Out-File $file
}

这是我正在使用的代码片段。我已经调试到这一点,并且在我用自己替换字符tilda ~之后代码没有更新,然后创建一个新行。当我将它输出到命令窗口并注释掉| Out-File $file时,代码工作正常。当我尝试将新结果传回原始文件时,代码没有打开"解包"文件。

2 个答案:

答案 0 :(得分:2)

更换工作正常。但是,您只插入换行符(LF,`n),而不是Windows用于编码换行符的回车符和换行符(CR-LF,`r`n)的组合。因此,在记事本中打开文件时看不到换行符。 PowerShell接受LF和CR-LF作为换行符编码,因此当您在那里输出文件时,您会看到正确包装的行。

将您的代码更改为此,您将获得预期的结果:

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

答案 1 :(得分: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
            }

        }