如何使用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次以上。因此,故障后可以“恢复”。