如何用txt文件中的两行替换一行

时间:2018-12-26 13:45:22

标签: powershell

我想要一些.cs模型文件附加注释。如果脚本找到了特定的属性,它将放在该属性注释的上方。

这是脚本:

$annotation = "[DatabaseGenerated(DatabaseGeneratedOption.Computed)]"
Get-ChildItem -Filter *.cs | % {
(Get-Content $_.FullName) | ForEach-Object { 
    if ($_ -match "StartDateTime") {
        $_ -replace $_ , "`n`t`t$annotation`n$_" 
    }
  } | Set-Content $_.FullName
}

它可以替换,但是最后我得到一个只有两行的空白文件(注释和自定义属性)。我意识到最后一个管道Set-Content $ _。FullName被弄乱了。 如果删除Set-Content,我的文件没有任何反应(未更新)?

1 个答案:

答案 0 :(得分:2)

这应该对您更好:

$filePath = '<YOUR PATH HERE>'
$annotation = "[DatabaseGenerated(DatabaseGeneratedOption.Computed)]"
Get-ChildItem -Path $filePath -Filter *.cs | ForEach-Object {
    $file = $_.FullName
    (Get-Content $file) | ForEach-Object { 
        # test all strings in $file
        if ($_ -match "StartDateTime") {
            # emit the annotation followed by the string itself
            "`r`n`t`t$annotation`r`n" + $_
        }
        else { 
            # just output the line as-is
            $_
        }
    }  | Set-Content -Path $file -Force
}

Foreach-Object中,我正在捕获$_.FullName供以后使用,并且也不要将其与以后在文件中用作行的$_混淆。 然后,如果该行确实与if相匹配,则输出替换的行,但如果不匹配(在else中),则您应输出不变的行。 然后,Set-Content总是输出每行,是否替换。

由于实际上您不是要替换字符串中的任何内容,而是在其前面加上注释,因此可以将其简化如下:

$annotation = "[DatabaseGenerated(DatabaseGeneratedOption.Computed)]"
Get-ChildItem -Path 'D:\' -Filter *.cs | ForEach-Object {
    $file = $_.FullName
    (Get-Content $file) | ForEach-Object { 
        # test all strings in $file
        if ($_ -match "StartDateTime") {
            # emit the annotation
            "`r`n`t`t$annotation"
        }
        # output the line as-is
        $_
    }  | Set-Content -Path $file -Force
}