Подготовка конфигурационного пакета

Ссылка на конфигурационный пакет: https://cloud.ldm.ru/index.php/s/EFpeAEQmG28oHw9

Предварительно необходимо заменить имена в URL при переносе конфигураций.

Важно! Нужные конфигурации уже выгружены и архив с конфигурациями сохранен на ПК.

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

  1. Сохранить и распаковать конфигурационные файлы.

img

2. Создать каталог, в котором будет расположен файл со скриптом для замены.

3. Открыть Windows PowerShell и перейти в каталог, где будет расположен файл со скриптом, выполнив команду:

cd C:\Scripts

4. Создать файл скрипта в нужном каталоге (после отработки может поступить запрос на подтверждение действий, в этом случае необходимо нажать клавишу [Enter]):

Создание скрипта

$scriptContent = @'
param(
    [string]$folderPath,
    [string]$searchValue,
    [string]$replaceValue
)
if (-not $folderPath -or -not $searchValue) {
    Write-Host "Использование: .\replace-in-archives.ps1 -folderPath 'C:\путь' -searchValue 'старое' -replaceValue 'новое'"
    exit 1
}
Write-Host "Начинаем обработку архивов в папке: $folderPath" -ForegroundColor Cyan
Write-Host "Замена: '$searchValue' -> '$replaceValue'" -ForegroundColor Yellow
$archives = Get-ChildItem -Path $folderPath -Filter *.zip
Write-Host "Найдено архивов: $($archives.Count)" -ForegroundColor Cyan
foreach ($archive in $archives) {
    Write-Host "`nОбработка архива: $($archive.Name)" -ForegroundColor Green

    $tempDir = Join-Path $env:TEMP ([Guid]::NewGuid().ToString())
    Write-Host "  Временная папка: $tempDir"
    New-Item -ItemType Directory -Path $tempDir | Out-Null
    Write-Host "  Распаковка..."
    Expand-Archive -Path $archive.FullName -DestinationPath $tempDir -Force

    $jsonFiles = Get-ChildItem -Path $tempDir -Filter *.json -Recurse
    Write-Host "  Найдено JSON файлов: $($jsonFiles.Count)"
     $replacementCount = 0
    foreach ($file in $jsonFiles) {
        $content = Get-Content $file.FullName -Raw -Encoding UTF8
        $newContent = $content -replace [regex]::Escape($searchValue), $replaceValue
        if ($content -ne $newContent) {
            $replacementCount += ([regex]::Matches($content, [regex]::Escape($searchValue))).Count
            Set-Content -Path $file.FullName -Value $newContent -Encoding UTF8
        }
    }
   $newArchivePath = $archive.FullName -replace '\.zip$', '_modified.zip'
    Write-Host "  Создание нового архива: $([System.IO.Path]::GetFileName($newArchivePath))"
    Compress-Archive -Path "$tempDir\*" -DestinationPath $newArchivePath -Force
    Write-Host "  Выполнено замен: $replacementCount" -ForegroundColor Magenta
   Remove-Item -Path $tempDir -Recurse -Force
}
Write-Host "`nОбработка завершена!" -ForegroundColor Green
'@
Set-Content -Path "replace-in-archives.ps1" -Value $scriptContent -Encoding UTF8

5. Перейти в каталог «C:\Scripts» и убедиться, что появился файл «replace-in-archives.ps1».

6. Выполнить в Windows PowerShell команду:

.\replace-in-archives.ps1 -folderPath "C:\Бэкап\dh-facade-service" -searchValue "https://example.com" -replaceValue "https://example2.com"

где:

  • "C:Бэкап\dh-facade-service" – путь до папки с архивами конфигураций сервиса dh-facade-service;
  • -searchValue "https://example.com" – значение, которое нужно найти;
  • -replaceValue "https://example2.com" – значение, на которое нужно заменить.

7. На экране отобразится процесс замены.

img

8. После завершения замены будут созданы копии архивов с замененными данными (префикс архивов _modified).

Далее рекомендуется выполнить проверку и поиск по архивам с префиксом _modified на старые и новые значения. Для этого необходимо выполнить следующие действия:

  1. Выполнить в Windows PowerShell команды (может потребоваться дополнительно нажать клавишу [Enter]):

Проверка на старые и новые значения

$path="C:\Бэкап\dh-facade-service"
$old="https://example.com"
$new="https://example2.com"
# Находим все архивы с префиксом _modified
$archivesToCheck = (Get-ChildItem -Path $path -Filter "*_modified.zip").BaseName -replace 'dh-facade-service-|_modified', ''
Write-Host "Найдено архивов для проверки: $($archivesToCheck.Count)" -ForegroundColor Magenta
foreach ($num in $archivesToCheck) {
    $archiveName = "dh-facade-service-${num}_modified.zip"
    $archivePath = Join-Path $path $archiveName
    Write-Host "`n=== Проверка $archiveName ===" -ForegroundColor Cyan
     $tempDir = "$env:TEMP\check_$num"
    if (Test-Path $tempDir) { Remove-Item $tempDir -Recurse -Force }
    New-Item -ItemType Directory -Path $tempDir | Out-Null
    # Распаковываем
    Expand-Archive -Path $archivePath -DestinationPath $tempDir -Force
    # Считаем JSON файлы
    $jsonFiles = Get-ChildItem -Path $tempDir -Filter *.json -Recurse
    Write-Host "Найдено JSON файлов: $($jsonFiles.Count)"
    # Ищем значения в каждом файле отдельно
    $totalOld = 0
    $totalNew = 0
    $filesWithOld = 0
    $filesWithNew = 0
    foreach ($file in $jsonFiles) {
        $content = Get-Content $file.FullName -Raw
        # Проверяем наличие значений
        $hasOld = $content -match ([regex]::Escape($old))
        $hasNew = $content -match ([regex]::Escape($new))
        if ($hasOld) {
            $filesWithOld++
            # Считаем точное количество вхождений
            $oldCount = [regex]::Matches($content, [regex]::Escape($old)).Count
            $totalOld += $oldCount
            Write-Host "  ❌ Файл: $(Split-Path $file.FullName -Leaf) содержит старое значение ($oldCount раз)" -ForegroundColor Red
        }
        if ($hasNew) {
            $filesWithNew++
            $newCount = [regex]::Matches($content, [regex]::Escape($new)).Count
            $totalNew += $newCount
        }
    }
     Write-Host "Результаты:" -ForegroundColor Yellow
    Write-Host "  Файлов со старым значением: $filesWithOld" -ForegroundColor $(if($filesWithOld -gt 0){"Red"}else{"Green"})
    Write-Host "  Файлов с новым значением: $filesWithNew" -ForegroundColor $(if($filesWithNew -gt 0){"Green"}else{"Yellow"})
    Write-Host "  Всего старых значений: $totalOld" -ForegroundColor $(if($totalOld -gt 0){"Red"}else{"Green"})
    Write-Host "  Всего новых значений: $totalNew" -ForegroundColor $(if($totalNew -gt 0){"Green"}else{"Yellow"})
  # Покажем пример содержимого из первого файла
    if ($jsonFiles.Count -gt 0) {
        $sampleFile = $jsonFiles[0]
        Write-Host "`nПример из файла: $(Split-Path $sampleFile.FullName -Leaf)" -ForegroundColor Gray
        $sampleContent = Get-Content $sampleFile.FullName -First 5
        Write-Host $sampleContent -ForegroundColor DarkGray
    }
   # Очистка
    Remove-Item -Path $tempDir -Recurse -Force
}

где:

  • $path – путь до папки;
  • $old – старые значения;
  • $new – новые значения.

2. На экране отобразится информация, изображенная на рисунке ниже.

img

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

Далее нужно удалить старые архивы и выполнить безопасный скрипт.

Удаление старых архивов

$path="C:\Бэкап\dh-facade-service"
# Посмотрим что будет удалено
Get-ChildItem -Path $path -Filter "dh-facade-service-*.zip" | 
    Where-Object { $_.Name -notlike "*_modified.zip" } |
    Select-Object Name, Length, LastWriteTime
# Удаляем (если уверены)
Get-ChildItem -Path $path -Filter "dh-facade-service-*.zip" | 
    Where-Object { $_.Name -notlike "*_modified.zip" } |
    Remove-Item -Force -WhatIf  # Сначала с -WhatIf для проверки
# Без -WhatIf для реального удаления
# Remove-Item -Force

где $path путь до папки с архивами.

Данный скрипт выделяет цветом удаленные архивы.

img

Убедившись, что процесс выполняется корректно и «лишних» файлов нет, необходимо в строке Remove-Item -Force –WhatIf убрать -WhatIf и еще раз выполнить скрипт.

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

Далее необходимо переименовать оставшиеся архивы и убрать префикс _modified – сначала с преефиксом –WhatIf, чтобы не удалить лишнего, а затем убрать –WhatIf.

Удаление префикса _modified

$path="C:\Бэкап\dh-facade-service"
Get-ChildItem -Path $path -Filter "*_modified.zip" | ForEach-Object {
    $newName = $_.Name -replace '_modified', ''
    Rename-Item -Path $_.FullName -NewName $newName -WhatIf
}

После выполнения всех действий необходимо сохранить результаты в ZIP-архив.