2016-05-24 59 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