Powershell - 替换一些线条

时间:2016-05-24 17:12:13

标签: file powershell set

我检查文件中缺少特殊位置的字符的行。如果缺少char,我会将其插入到那个确切的位置。现在我想用旧行上的额外字符将新行写入文件。例如,我在文件中有以下内容:

"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
    }
}

该代码确实将char插入正确的位置。但最后只有第一行在文件中,而不是全部三行。 我认为我很接近,但刚开始使用PowerShell。

2 个答案:

答案 0 :(得分:2)

Set-Content用输入值替换文件中的所有内容。你在循环的每次迭代中独立调用它,当你真正想要的是用循环的所有结果来调用它。

有很多方法可以更改它,但我会考虑将foreach替换为ForEach-Object,并将结果汇​​总到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 :(得分:2)

正如@briantist指出的那样,你需要在for循环之外移动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