Public/Compress-1Clogs.ps1

<#
.SYNOPSIS
    Архивирует и очищает журналы регистрации (ЖР) 1С в каталогах srvinfo.
 
.DESCRIPTION
    Для каждого пути srvinfo* из (Get-1C).SrvinfoPaths или одного, указанного через -Path:
      1) Находит подкаталоги reg_*
      2) В каждом reg_* находит подкаталоги по GUID (UUID)
      3) В каждом UUID-подкаталоге заходит в папку 1Cv8Log
      4) Удаляет ZIP-архивы старше ArchiveDays
      5) Архивирует файлы .lgx и .lgp, старше FileDays (один файл -> один ZIP)
      6) Ведёт лог выполнения в C:\ClearCashe1CLog.txt
 
    Скрипт НЕ меняет структуру каталогов и обрабатывает только файлы логов (.lgx/.lgp) и ZIP-архивы.
    Удаление исходного файла выполняется ТОЛЬКО после успешного создания ZIP.
 
.PARAMETER FileDays
    Количество дней, спустя которое исходные файлы журналов (.lgx/.lgp) будут заархивированы.
    Значение по умолчанию: 7.
 
.PARAMETER ArchiveDays
    Количество дней, по истечении которых ZIP-архивы будут удалены.
    Значение по умолчанию: 90.
 
.PARAMETER Path
    Необязательный. Конкретный путь к каталогу srvinfo (например, 'D:\srvinfo17').
    Если не указан — пути берутся из (Get-1C).SrvinfoPaths.
 
.INPUTS
    System.Int32, System.String.
    Параметры можно передавать по конвейеру по имени (PS 3.0+ автоматически сопоставляет по именам).
 
.OUTPUTS
    Нет. Функция пишет прогресс и итоги в консоль/лог, полезные артефакты — ZIP-файлы в каталоге 1Cv8Log.
 
.EXAMPLE
    PS> Compress-1Clogs
    Выполнит архивацию и очистку ЖР во всех каталогах srvinfo, обнаруженных функцией Get-1C.
 
.EXAMPLE
    PS> Compress-1Clogs -Path 'D:\srvinfo17'
    Обработает только указанный каталог srvinfo.
 
.EXAMPLE
    PS> Compress-1Clogs -FileDays 3 -ArchiveDays 30
    Заархивирует файлы логов старше 3 дней, удалит ZIP-архивы старше 30 дней.
 
.NOTES
    Требования:
      • Windows PowerShell 5.1+ (для Compress-Archive)
      • Доступ на чтение/запись к каталогам srvinfo и к логу C:\ClearCashe1CLog.txt
      • Наличие функции Get-1C (для автопоиска путей srvinfo)
 
    Лог: C:\ClearCashe1CLog.txt (пересоздаётся, если старше 7 дней).
 
    Важное:
      • На macOS/Linux функция загрузится, но выполняться не будет из-за Windows-специфичных путей.
      • Для крупных логов архивирование может занять время; используйте планировщик задач для регулярного запуска.
 
.LINK
    Get-1C
    Get-Help Compress-Archive
#>


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"
}