Как вставить текст после определенной строки в файлах с помощью powershell?

58
7

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


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


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


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.

спросил(а) 2010-11-01T11:04:00+03:00 9 лет, 12 месяцев назад
1
Решение
82

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


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

ответил(а) 2010-11-01T11:42:00+03:00 9 лет, 12 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема