Public/New-1CDistroPackage.ps1
|
<#
.SYNOPSIS Подготовка директории с дистрибутивами .DESCRIPTION Подготовка директории с дистрибутивами. Распаковка серверных архивов формата windows64full_8_3_xx_xxxx.rar (например: windows64full_8_3_22_1704.rar) и перенос содержимого в структуру: <1cv8.adm>\<версия>\Server\64 Функция ищет архивы ИСКЛЮЧИТЕЛЬНО серверного формата windows64full_*.rar в корне каталога дистрибутивов (Find-1CDistroFolder → обычно 1cv8.adm). Клиентские архивы/папки (windows_*) игнорируются. На выходе возвращает объект с полями: VersionString, Version ([Version]), Arch ('64'), Path (путь к распакованной папке). #> function New-1CDistroPackage { if (Find-1CDistroFolder) { Write-Host "Тестирование предподготовки дистрибутивов" -ForegroundColor Cyan # Основная папка с дистрибутивами (например, X:\1cv8.adm) $DistrDirectory = Find-1CDistroFolder if (-not (Test-Path -LiteralPath $DistrDirectory)) { Write-Error "Папка с дистрибутивами не найдена: $DistrDirectory" return } # Ищем ТОЛЬКО серверные архивы .rar вида windows64full_8_3_*.rar $distributionItems = Get-ChildItem -LiteralPath $DistrDirectory -Filter 'windows64full_8_3_*.rar' -File -ErrorAction SilentlyContinue if (-not $distributionItems -or $distributionItems.Count -eq 0) { Write-Error "В '$DistrDirectory' не найдено серверных архивов вида windows64full_8_3_xx_xxxx.rar (например: windows64full_8_3_22_1704.rar)." return } $results = @() foreach ($item in $distributionItems) { # Для архивов берём BaseName без расширения $itemName = $item.BaseName # Ожидаемый формат имени: windows64full_8_3_22_1704 if ($itemName -match '^windows64full_(?<version>\d+_\d+_\d+_\d+)$') { $arch = '64' # сервер — всегда 64-бит $versionStr = $matches['version'] -replace '_', '.' try { $versionObj = [Version]$versionStr } catch { Write-Warning "Не удалось преобразовать версию '$versionStr' из '$itemName'. Пропускаем." continue } } else { Write-Warning "Архив '$itemName' не соответствует ожидаемому формату windows64full_8_3_xx_xxxx. Пропускаем." continue } # Формируем целевую структуру: # <1cv8.adm>\<версия>\Server\64 $targetVersionFolder = Join-Path -Path $DistrDirectory -ChildPath ("{0}\Server" -f $versionStr) $targetSubFolder = Join-Path -Path $targetVersionFolder -ChildPath $arch if (-not (Test-Path -LiteralPath $targetSubFolder)) { New-Item -ItemType Directory -Path $targetSubFolder -Force | Out-Null } # Распаковываем RAR (требуется 7-Zip) $sevenZipPath = "C:\Program Files\7-Zip\7z.exe" if (-not (Test-Path -LiteralPath $sevenZipPath)) { Write-Error "7-Zip не найден по пути '$sevenZipPath'. Невозможно извлечь RAR-архив." continue } # Если целевой каталог уже не пуст — пропускаем извлечение $targetNotEmpty = (Test-Path -LiteralPath $targetSubFolder) -and ((Get-ChildItem -LiteralPath $targetSubFolder -Force | Measure-Object).Count -gt 0) if ($targetNotEmpty) { Write-Host "Каталог '$targetSubFolder' уже содержит файлы. Извлечение '$($item.Name)' пропускается." -ForegroundColor DarkYellow } else { Write-Host "Извлекаем RAR-архив '$($item.Name)' в '$targetSubFolder'" -ForegroundColor Yellow & $sevenZipPath x $item.FullName -o"$targetSubFolder" -y | Out-Null } 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 "Папка с дистрибутивами не найдена" } } |