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
    )

    # --- Настройки логирования ---
    $LogFile  = 'C:\ClearCashe1CLog.txt'
    $NowStamp = { (Get-Date).ToString('yyyy-MM-dd HH:mm:ss') }

    # Убедимся, что лог существует и сбросим старый
    if (-not (Test-Path $LogFile)) {
        New-Item -Path $LogFile -ItemType File -Force | Out-Null
    } elseif ((Get-Item $LogFile).CreationTime -lt (Get-Date).AddDays(-7)) {
        Remove-Item $LogFile -Force
        New-Item -Path $LogFile -ItemType File -Force | Out-Null
    }

    # Собираем корни srvinfo
    try {
        $roots = if ($Path) { @($Path) } else { (Get-1C).SrvinfoPaths }
    }
    catch {
        Write-Error "Не удалось получить список путей srvinfo: $($_.Exception.Message)"
        return
    }

    foreach ($root in $roots) {
        Write-Verbose "Обработка корня: $root"

        # 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)) {
                    Add-Content $LogFile "$(& $NowStamp) Пропущено (нет папки): $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): $($_.Exception.Message)"
                      }
                  }

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

                      try {
                          Compress-Archive -LiteralPath $origFile `
                                           -DestinationPath $zipPath `
                                           -CompressionLevel Fastest `
                                           -Force
                          Add-Content $LogFile "$(& $NowStamp) Создан архив: $zipPath из $origFile"

                          # Удаляем исходный только после успешного создания
                          Remove-Item $origFile -Force
                      }
                      catch {
                          Add-Content $LogFile "$(& $NowStamp) ОШИБКА архивации $origFile $($_.Exception.Message)"
                      }
                  }
            }
        }
    }

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