Compress-1Clogs.ps1

<#
.SYNOPSIS
    Архивация журналов регистрации информационных баз 1С.
 
.DESCRIPTION
    Для каждого пути srvinfo* из Get-1C.SrvinfoPaths (или одного, указанного через -Path):
    1) Находит подкаталоги reg_*
    2) В каждом reg_* находит подкаталоги по GUID (UUID)
    3) В каждом UUID-подкаталоге идет в папку 1Cv8Log
    4) Удаляет ZIP-архивы старше ArchiveDays
    5) Архивирует файлы .lgx и .lgp старше FileDays
    6) Логирует все действия в C:\ClearCashe1CLog.txt
 
.PARAMETER FileDays
    Дней хранения исходных файлов логов перед архивацией (по умолчанию 7).
 
.PARAMETER ArchiveDays
    Дней хранения ZIP-архивов перед удалением (по умолчанию 90).
 
.PARAMETER Path
    (опционально) Конкретный путь srvinfo. Если не указан — берутся все из (Get-1C).SrvinfoPaths.
 
.EXAMPLE
    # По всем srvinfo*
    Compress-1Clogs
 
.EXAMPLE
    # Только для D:\srvinfo17
    Compress-1Clogs -Path 'D:\srvinfo17'
#>

function Compress-1Clogs {
    [CmdletBinding()]
    param(
        [int]    $FileDays     = 7,
        [int]    $ArchiveDays  = 90,
        [string] $Path
    )

    # Лог и 7-Zip
    $LogFile      = 'C:\ClearCashe1CLog.txt'
    $SevenZip     = 'C:\Program Files\7-Zip\7z.exe'
    $NowStamp     = Get-Date -Format 'yyyy-MM-dd HH:mm:ss'

    # Проверки
    if (-not (Test-Path $SevenZip)) {
        throw "7-Zip не найден по пути: $SevenZip"
    }
    if (-not (Test-Path $LogFile)) {
        New-Item $LogFile -ItemType File | Out-Null
    }
    if ((Get-Item $LogFile).CreationTime -lt (Get-Date).AddDays(-7)) {
        Remove-Item $LogFile -Force
    }

    # Собираем корни srvinfo
    $roots = if ($Path) { @($Path) } else { (Get-1C).SrvinfoPaths }

    foreach ($root in $roots) {
        # 1) Ищем reg_* папки
        $regDirs = Get-ChildItem -Path $root -Directory -Filter 'reg_*' -ErrorAction SilentlyContinue
        foreach ($reg in $regDirs) {
            # 2) Внутри reg_* ищем UUID-папки
            $uuidDirs = Get-ChildItem -Path $reg.FullName -Directory | 
                        Where-Object { $_.Name -match '^[0-9A-Fa-f]{8}(-[0-9A-Fa-f]{4}){3}-[0-9A-Fa-f]{12}$' }
            foreach ($uuid in $uuidDirs) {
                # 3) Переходим в 1Cv8Log
                $logDir = Join-Path $uuid.FullName '1Cv8Log'
                if (-not (Test-Path $logDir)) {
                    Write-Verbose "Не найдена папка логов: $logDir"
                    continue
                }

                # 4) Удаляем старые ZIP
                Get-ChildItem -Path $logDir -Recurse -File -Filter '*.zip' |
                  Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-$ArchiveDays) } |
                  ForEach-Object {
                      try {
                          Remove-Item $_.FullName -Force
                          Add-Content $LogFile "$NowStamp Удалён архив: $($_.FullName)"
                      } catch {
                          Add-Content $LogFile "$NowStamp Ошибка удаления архива $($_.FullName): $_"
                      }
                  }

                # 5) Архивируем .lgx и .lgp
                Get-ChildItem -Path $logDir -Recurse -File |
                  Where-Object {
                      @('.lgx','.lgp') -contains $_.Extension.ToLower() -and
                      $_.LastWriteTime -lt (Get-Date).AddDays(-$FileDays)
                  } |
                  ForEach-Object {
                      $zipName = "{0}_{1}.zip" -f $_.BaseName, ($_.Extension.TrimStart('.'))
                      $zipPath = Join-Path $_.DirectoryName $zipName

                      if (Test-Path $zipPath) {
                          Remove-Item $zipPath -Force
                      }

                      $args = @('a','-tzip',$zipPath,$_.FullName,'-mx=1')
                      $proc = Start-Process -FilePath $SevenZip -ArgumentList $args -NoNewWindow -Wait -PassThru

                      if ($proc.ExitCode -eq 0 -and (Test-Path $zipPath)) {
                          Add-Content $LogFile "$NowStamp Создан архив: $zipPath из $($_.FullName)"
                          Remove-Item $_.FullName -Force
                      } else {
                          Add-Content $LogFile "$NowStamp Ошибка архивации: $($_.FullName)"
                      }
                  }
            }
        }
    }

    Write-Host "Compress-1Clogs завершён. Подробности в логе: $LogFile"
}