我检查文件中缺少特殊位置的字符的行。如果缺少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。
答案 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