如何使用PowerShell在文件中的特定行之后插入文本?

时间:2010-11-01 08:04:52

标签: powershell

作为巨大重构的一部分,我删除了一些重复的类和枚举。我移动了名称空间并重新构建了一切,以便将来更容易维护。

除了一件事之外,所有更改都已编写过。如果尚未插入数据协定命名空间,我需要在每个使用另一个命名空间的文件中插入数据协定命名空间。

我目前所拥有的代码不起作用,但我认为这是我需要的。

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
}

编辑:代码倾向于使用“Company.Services.Contracts”语句输出(用 - 覆盖整个文件)。

1 个答案:

答案 0 :(得分:3)

目前还不太清楚你到底要做什么,但我会试着猜测,看看我在代码中的评论。我认为原始代码包含一些错误,一个是严重的: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

注意:大概你不应该多次将此代码应用于源代码,代码不是为此设计的。