如何使用powershell在文件中的特定行后插入文本?
作为大规模重构的一部分,我删除了一些重复的类和枚举。我移动了名称空间,并对所有内容进行了重组,以便将来更易于维护 除一件事外,所有更改都已编写脚本。如果尚未插入数据约定名称空间,则需要在使用另一名称空间的每个文件中插入数据约定名称空间 我现在的代码不起作用,但我想这是我需要的如何使用powershell在文件中的特定行后插入文本?,powershell,Powershell,作为大规模重构的一部分,我删除了一些重复的类和枚举。我移动了名称空间,并对所有内容进行了重组,以便将来更易于维护 除一件事外,所有更改都已编写脚本。如果尚未插入数据约定名称空间,则需要在使用另一名称空间的每个文件中插入数据约定名称空间 我现在的代码不起作用,但我想这是我需要的 function Insert-Usings{ trap { Write-Host ("ERROR: " + $_) -ForegroundColor Red return $fal
function Insert-Usings{
trap {
Write-Host ("ERROR: " + $_) -ForegroundColor Red
return $false
}
(Get-ChildItem $base_dir -Include *.asmx,*.ascx,*.cs,*.aspx -Force -Recurse -ErrorAction:SilentlyContinue) | % {
$fileName = $_.FullName
(Get-Content $fileName) |
Foreach-Object
{
$_
if ($_ -cmatch "using Company.Shared;") {
$_ -creplace "using Company.Shared;", "using Company.Common;"
}
elseif ($_ -cmatch "using Company") {
#Add Lines after the selected pattern
"using Company.Services.Contracts;"
}
else{
$_
}
}
} | Set-Content $fileName
}
编辑:代码倾向于输出(覆盖整个文件)使用“using Company.Services.Contracts”语句。不太清楚您到底要得到什么,但我会尝试猜测,请参阅代码中的注释。我认为,原始代码包含一些错误,其中一个是严重的:
Set Content
用于错误的管道/循环。这是正确的代码
function Insert-Usings
{
trap {
Write-Host ("ERROR: " + $_) -ForegroundColor Red
return $false
}
(Get-ChildItem $base_dir -Include *.asmx,*.ascx,*.cs,*.aspx -Force -Recurse -ErrorAction:SilentlyContinue) | % {
$fileName = $_.FullName
(Get-Content $fileName) | % {
if ($_ -cmatch "using Company\.Shared;") {
# just replace
$_ -creplace "using Company\.Shared;", "using Company.Common;"
}
elseif ($_ -cmatch "using Company") {
# write the original line
$_
# and add this after
"using Company.Services.Contracts;"
}
else{
# write the original line
$_
}
} |
Set-Content $fileName
}
}
例如,它取代了以下内容:
xxx
using Company.Shared;
using Company;
ttt
为此:
xxx
using Company.Common;
using Company;
using Company.Services.Contracts;
ttt
注意:假设您不应该将此代码应用于源代码多次,此代码不是为此而设计的。是否失败?错误消息是什么?或者它是否做了一些与您想要的不同的事情?很抱歉在原始问题中不够清楚。我会更新一些更多的信息。效果很好!你能详细说明一下脚注中关于不是为这个设计的吗。我能做些什么让它更安全?该代码不打算运行多次。这将是部署例程的一个步骤,每个客户只运行一次,但您是否看到我可以改进上述代码的任何方法?如果您再次运行此代码,它将使用公司的
在每行之后添加一些代码。这将是错误的,因为它已经在第一次运行时完成。只是不要运行它两次-我认为这是最好的简单解决方案。如果在中间运行失败,则丢弃/销毁所有部分更改的源,获取原件,在解决问题后再运行。希望我能给您更多的要点来提供有用的答案;或者,更安全的是,您可以添加并使用一个函数/代码来检查文件是否已被处理(使用
s包含新的)。在主循环中,您首先调用它,然后调用Insert Usings
,仅当它尚未完成时。这样的过程可以在相同的源上安全地调用2次以上。因此,故障后可以“恢复”。