New-1CDistroPackage.ps1

<#
    .SYNOPSIS
        Подгтовка директории с дистрибутивами
        .DESCRIPTION
        Подготовка директории с дистрибутивами. Распаковка архивов, перенос в директорию, соответствующую требованиям "номер версии\сервер(клиент)\разрядность"
    #>

function New-1CDistroPackage {
    if (Find-1CDistroFolder) {
        Write-Host "Тестирование предпоготовки дистрибутивов" -ForegroundColor Cyan

        # Получаем основную папку с дистрибутивами (например, X:\1cv8.adm)
        $DistrDirectory = Find-1CDistroFolder
        if (-not (Test-Path $DistrDirectory)) {
            Write-Error "Папка с дистрибутивами не найдена: $DistrDirectory"
            return
        }

        # Получаем все элементы, начинающиеся с "windows" (папки и архивы)
        $distributionItems = Get-ChildItem -Path $DistrDirectory | Where-Object { $_.Name -like "windows*" }

        # Массив для хранения информации по всем обработанным дистрибутивам
        $results = @()

        foreach ($item in $distributionItems) {
            # Определяем имя элемента для парсинга (для файлов берем BaseName, для папок – Name)
            $itemName = if ($item.PSIsContainer) { $item.Name } else { $item.BaseName }

            # Парсим имя: ожидаемые форматы:
            # 64‑бит: windows64full_8_3_22_1709
            # 32‑бит: windows_8_3_22_1709
            if ($itemName -match "^windows(?<arch>64full)?_(?<version>\d+_\d+_\d+_\d+)$") {
                $arch = if ($matches['arch']) { "64" } else { "36" }
                $versionStr = $matches['version'] -replace '_', '.'
                try {
                    $versionObj = [Version]$versionStr
                }
                catch {
                    Write-Warning "Не удалось преобразовать версию '$versionStr' из '$itemName'. Пропускаем."
                    continue
                }
            }
            else {
                Write-Warning "Папка или архив '$itemName' не соответствует ожидаемому формату. Пропускаем."
                continue
            }

            # Формируем целевую структуру внутри основной папки:
            # - Папка с номером версии, внутри которой должна быть папка "Server",
            # а в ней – подпапка с разрядностью (64 для 64‑бит, 36 для 32‑бит)
            $targetVersionFolder = Join-Path -Path $DistrDirectory -ChildPath ("{0}\Server" -f $versionStr)
            $targetSubFolder     = Join-Path -Path $targetVersionFolder -ChildPath $arch

            # Если каталог назначения не существует, создаём его
            if (-not (Test-Path $targetSubFolder)) {
                New-Item -ItemType Directory -Path $targetSubFolder -Force | Out-Null
            }

            if ($item.PSIsContainer) {
                # Если элемент – папка, используем её содержимое
                $sourceFolder = $item.FullName

                Write-Host "Копирование содержимого папки '$itemName' в '$targetSubFolder'" -ForegroundColor Yellow
                Copy-Item -Path "$sourceFolder\*" -Destination $targetSubFolder -Force -Recurse
            }
            else {
                # Если элемент – файл (архив), проверяем расширение
                if ($item.Extension -ieq ".zip" -or $item.Extension -ieq ".rar") {
                    # Если целевой каталог уже существует и не пуст, пропускаем извлечение
                    $targetNotEmpty = (Test-Path $targetSubFolder) -and ((Get-ChildItem -Path $targetSubFolder -Force | Measure-Object).Count -gt 0)
                    if ($targetNotEmpty) {
                        Write-Host "Каталог '$targetSubFolder' уже существует и содержит файлы. Извлечение архива '$($item.Name)' пропускается." -ForegroundColor DarkYellow
                    }
                    else {
                        if ($item.Extension -ieq ".zip") {
                            Write-Host "Извлекаем ZIP-архив '$($item.Name)' непосредственно в '$targetSubFolder'" -ForegroundColor Yellow
                            Expand-Archive -Path $item.FullName -DestinationPath $targetSubFolder -Force -Recurse
                        }
                        elseif ($item.Extension -ieq ".rar") {
                            Write-Host "Извлекаем RAR-архив '$($item.Name)' непосредственно в '$targetSubFolder'" -ForegroundColor Yellow
                            $sevenZipPath = "C:\Program Files\7-Zip\7z.exe"
                            if (Test-Path $sevenZipPath) {
                                & $sevenZipPath x $item.FullName -o"$targetSubFolder" -y | Out-Null
                            }
                            else {
                                Write-Error "7-Zip не найден по пути '$sevenZipPath'. Невозможно извлечь RAR-архив."
                                continue
                            }
                        }
                    }
                    # После извлечения для архивов считаем, что содержимое находится в $targetSubFolder
                    $sourceFolder = $targetSubFolder
                }
                else {
                    Write-Warning "Файл '$($item.Name)' не является распознаваемым архивом. Пропускаем."
                    continue
                }
            }

            Write-Host "Обработка '$itemName' завершена. Содержимое находится в '$targetSubFolder'" -ForegroundColor Green

            # Сохраняем информацию об обработанном дистрибутиве
            $results += [PSCustomObject]@{
                VersionString = $versionStr
                Version       = $versionObj
                Arch          = $arch
                Path          = $targetSubFolder
            }
        }

        if ($results.Count -eq 0) {
            Write-Error "Не найдено ни одной подходящей папки или архива с дистрибутивами."
            return
        }

        # Выбираем объект с максимальной (последней) версией
        $latest = $results | Sort-Object Version -Descending | Select-Object -First 1

        return $latest
    }
        else {
            throw "Папка с дистрибутивами не найдена"
        }
}