我想要一些.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,我的文件没有任何反应(未更新)?
答案 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
}