Compress-1Clogs.ps1

<#
.SYNOPSIS
    Архивация журналов регистрации информационных баз 1С.
 
.DESCRIPTION
    Сжимает файлы .lgx и .lgp в поддиректории "1Cv8Log" для каждого каталога srvinfo.
    По умолчанию:
      - файлы журналов старше 7 дней архивируются,
      - архивы старше 90 дней удаляются.
    Можно задать свои границы через параметры -FileDays и -ArchiveDays.
.PARAMETER FileDays
    Количество дней хранения исходных файлов (логов) до архивации. По умолчанию 7.
.PARAMETER ArchiveDays
    Количество дней хранения архивов перед удалением. По умолчанию 90.
.PARAMETER Path
    Опционально: конкретная папка srvinfo. Если не указана, берутся все пути из Get-1C.SrvinfoPaths.
.EXAMPLE
    Compress-1Clogs
    # архивирует логи старше 7 дней в каждой папке srvinfo*
.EXAMPLE
    Compress-1Clogs -FileDays 14 -ArchiveDays 60
    # пользовательские интервалы.
.EXAMPLE
    Compress-1Clogs -Path "D:\srvinfo17"
    # только для указанной папки.
.NOTES
    Для работы требуется 7-Zip (7z.exe) в "C:\Program Files\7-Zip\7z.exe".
#>

function Compress-1Clogs {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $false)]
        [int] $FileDays = 7,

        [Parameter(Mandatory = $false)]
        [int] $ArchiveDays = 90,

        [Parameter(Mandatory = $false)]
        [string] $Path
    )

    # пути к каталогам srvinfo
    $srvPaths = if ($Path) {
        @($Path)
    } else {
        (Get-1C).SrvinfoPaths
    }

    # настройки
    $logRetention    = $FileDays
    $archiveRetention = $ArchiveDays
    $logFile         = "C:\ClearCashe1CLog.txt"
    $sevenZip        = "C:\Program Files\7-Zip\7z.exe"
    $subFolder       = "1Cv8Log"
    $timestamp       = Get-Date -Format "yyyy-MM-dd HH:mm:ss"

    # проверяем 7z
    if (-not (Test-Path $sevenZip)) {
        throw "7z.exe не найден по пути $sevenZip"
    }

    # лог-файл
    if (-not (Test-Path $logFile)) {
        New-Item -Path $logFile -ItemType File | Out-Null
    }

    # чистим лог старше 7 дней
    if ((Get-Item $logFile).CreationTime -lt (Get-Date).AddDays(-7)) {
        Remove-Item $logFile -Force
    }

    foreach ($srv in $srvPaths) {
        $regRoot = Join-Path $srv "reg_1541"
        if (-not (Test-Path $regRoot)) {
            Write-Verbose "Путь не найден: $regRoot — пропускаем"
            continue
        }

        # 1. Удаляем старые ZIP
        $zipFiles = Get-ChildItem -Path (Join-Path $regRoot $subFolder) -Recurse -File -Filter *.zip -ErrorAction SilentlyContinue
        foreach ($zip in $zipFiles) {
            if ($zip.LastWriteTime -lt (Get-Date).AddDays(-$archiveRetention)) {
                try {
                    Remove-Item $zip.FullName -Force
                    Add-Content $logFile "$timestamp Удалён архив: $($zip.FullName)"
                } catch {
                    Add-Content $logFile "$timestamp Ошибка удаления архива $($zip.FullName): $_"
                }
            }
        }

        # 2. Архивируем логи
        $logFiles = Get-ChildItem -Path (Join-Path $regRoot $subFolder) -Recurse -File |
                    Where-Object { @('.lgx','.lgp') -contains $_.Extension.ToLower() -and $_.LastWriteTime -lt (Get-Date).AddDays(-$logRetention) }
        foreach ($file in $logFiles) {
            $archiveName = "{0}_{1}.zip" -f $file.BaseName, $file.Extension.TrimStart('.')
            $archivePath = Join-Path $file.DirectoryName $archiveName

            # удаляем старый архив, если есть
            if (Test-Path $archivePath) { Remove-Item $archivePath -Force }

            # собираем аргументы 7z
            $args = @('a','-tzip',$archivePath,$file.FullName,'-mx=1')
            $proc = Start-Process -FilePath $sevenZip -ArgumentList $args -NoNewWindow -Wait -PassThru

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

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