Вот скрипт Powershell , который я использовал для выполнения болезненного переименования пространства имен. В моей ситуации было около 5000 исходных файлов VB.Net и C #, широко использующих общую библиотеку ( CSLA ). По причинам, не заслуживающим обсуждения, мне нужно было переименовать пространство имен Csla в CslaLegacy . С минимальными усилиями вы сможете адаптировать этот скрипт к вашим конкретным потребностям. Сценарий рекурсивно ищет дерево исходных текстов в поисках файлов .vb и .cs. Хеш-таблица $ repValues содержит строки, которые необходимо заменить. Вариант этого сценария также можно использовать для обновления ссылок проекта, если ваше переименование включает изменение имени сборки. Вы можете добавить вызов в свой инструмент управления версиями, чтобы извлечь файл перед изменением. Первоначально я делал это для TFS, но обнаружил, что он медленно запускает tf.exe. В конце концов, было намного быстрее просто извлечь все дерево исходных текстов перед запуском скрипта. Я использую PowerGUI редактор сценариев для отладки и запуска сценариев PowerShell.
$root = "c:/path/to/your/source"
cd $root
$files = Get-ChildItem -Path $root -Recurse -include *.cs,*.vb
$repValues =
@{
'using Csla;' = 'using CslaLegacy;';
'using Csla.Validation;' = 'using CslaLegacy.Validation;';
'using Csla.Data;' = 'using CslaLegacy.Data;';
'Imports Csla' = 'Imports CslaLegacy';
'Imports Csla.Validation' = 'Imports CslaLegacy.Validation';
}
$stmtsToReplace = @()
foreach ($key in $repValues.Keys) { $stmtsToReplace += $null }
$repValues.Keys.CopyTo($stmtsToReplace, 0)
foreach ($file in $files)
{
$path = [IO.Path]::Combine($file.DirectoryName, $file.Name)
$sel = Select-String -Pattern $stmtsToReplace -Path $path -l
if ($sel -ne $null)
{
write "Modifying file $path"
(Get-Content -Encoding Ascii $path) |
ForEach-Object {
$containsStmt = $false
foreach ($key in $repValues.Keys)
{
if ($_.Contains($key))
{
$_.Replace($key, $repValues[$key])
$containsStmt = $true
break
}
}
if (!$containsStmt) { $_ }
} |
Set-Content -Encoding Ascii $path
}
}