Как вставить текст после определенной строки в файлы с помощью powershell? - PullRequest
1 голос
/ 01 ноября 2010

В рамках огромного рефакторинга я удалил несколько дублирующих классов и перечислений. Я переместил пространства имен и реструктурировал все, чтобы было легче поддерживать в будущем.

Все изменения уже внесены в сценарий, кроме одного. Мне нужно вставить пространство имен контракта данных в каждый файл, который использует другое пространство имен, если пространство имен контракта данных еще не было вставлено.

Код, который у меня есть на данный момент, не работает, но это то, что мне нужно.

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".

1 Ответ

3 голосов
/ 01 ноября 2010

Не совсем понятно, что именно вы получите, но я постараюсь угадать, см. Мои комментарии в коде.Исходный код, я думаю, содержит несколько ошибок, одна серьезная: 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

Примечание: предположительно, вам не следует применятьэтот код для источников более одного раза, код не предназначен для этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...