Compress-1Clogs.ps1

<#
    .SYNOPSIS
         
        .DESCRIPTION
        Архивация журналов регистрации информационных баз 1С
        Использование - стандартно, без указания параметров, время хранения:
            - файлов журналов регистрации: 7 дней
            - архивов файлов журналов регистрации: 90 дней
        Для задания своего временного диапазона, при запуске функции достаточно указать эти два параметра.
        Пример:
            - Compress-1Clogs -fileDays 14 -archiveDays 60
        Первый параметр - количество дней хранения файлов, второй параметр для архивов.
        Степень сжатия минимальная.
        .PARAMETER Path
        The path that will be searched for a registry key.
        .EXAMPLE
         Compress-1Clogs -fileDays 14 -archiveDays 60
        .INPUTS
        System.String
        .OUTPUTS
        Microsoft.Win32.RegistryKey
        .NOTES
        This module is an example of what a well documented function could look.
        .LINK
        
    #>

function Compress-1Clogs ($fileDays = 7, $archiveDays = 90) {
    $logRetentionDays = $fileDays
    $archiveRetentionDays = $archiveDays
    
    #Получим путь к директории srvinfo, используя йункцию 1CMSrvinfo
    [string]$getRootDirectory = (Get-1C).SrvinfoPaths
    $rootDirectory = $getRootDirectory + "\reg_1541" 
    $logFile = "C:\ClearCashe1CLog.txt"
    $sevenZipPath = "C:\Program Files\7-Zip\7z.exe"
    $targetDirectoryName = "1Cv8Log"
    $data = Get-Date

    # Проверка наличия 7z.exe
    if (-Not (Test-Path $sevenZipPath)) {
        Write-Host "7z.exe не найден по пути $sevenZipPath. Скрипт завершен."
        exit
    }

    # очистка лога выполнения функции, старше 7 дней
    if ((Get-ChildItem $logFile).CreationTime -lt (Get-Date).AddDays(-7)) {
        Remove-Item $logFile -Force
    }

    Get-ChildItem -Path $rootDirectory -Directory | Where-Object { 
        $_.Name -match "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$" 
    } | ForEach-Object {
        $uuidDirectory = $_.FullName
        $targetDirectory = Join-Path $uuidDirectory $targetDirectoryName
        if (Test-Path $targetDirectory) {
            # Удаление архивов старше $archiveRetentionDays дней
            Get-ChildItem -Path $targetDirectory -Recurse -File | Where-Object {
            ($_.Extension -eq ".zip") -and ($_.LastWriteTime -lt (Get-Date).AddDays(-$archiveRetentionDays))
            } | ForEach-Object {
                try {
                    Write-Host "Удаление старого архива: $($_.FullName)"
                    Remove-Item $_.FullName -Force
                    Add-Content -Path $logFile -Value "$data Удалён старый архив: $($_.FullName)"
                }
                catch {
                    $errorMessage = $_.Exception.Message
                    Write-Host "Ошибка удаления архива: $errorMessage"
                    Add-Content -Path $logFile -Value "$data Ошибка удаления архива: $errorMessage"
                }
            }
        
            # Обработка файлов .lgx и .lgp
            Get-ChildItem -Path $targetDirectory -Recurse -File | Where-Object {
            ( ($_.Extension -eq ".lgx") -or ($_.Extension -eq ".lgp") ) -and ($_.LastWriteTime -lt (Get-Date).AddDays(-$logRetentionDays))
            } | ForEach-Object {
                try {
                    # Формируем имя архива: имяФайла_расширение.zip (расширение без точки)
                    $archiveName = "$($_.BaseName)_$($_.Extension.TrimStart('.')).zip"
                    $zipPath = Join-Path $_.DirectoryName $archiveName
                
                    # Если архив уже существует, удаляем его
                    if (Test-Path $zipPath) {
                        Remove-Item $zipPath -Force
                    }
                
                    # Формируем пути в кавычках для 7-Zip
                    $zipPathQuoted = '"' + $zipPath + '"'
                    $sourceFileQuoted = '"' + $_.FullName + '"'
                    $arguments = @("a", "-tzip", $zipPathQuoted, $sourceFileQuoted, "-mx=1")
                
                    Write-Host "Архивирование файла с помощью 7zip: $($_.FullName) в $zipPath"
                    Start-Process -FilePath $sevenZipPath -ArgumentList $arguments -NoNewWindow -Wait -PassThru
                
                    Start-Sleep -Seconds 2  # Ждем, чтобы убедиться, что архив создан
                
                    if ((Test-Path $zipPath) -and ((Get-Item $zipPath).Length -gt 0)) {
                        Write-Host "Архивирован файл: $($_.FullName) в $zipPath"
                        Add-Content -Path $logFile -Value "$data Создан архив: $zipPath файла: $($_.FullName)"
                        Write-Host "Удаление исходного файла: $($_.FullName)"
                        Remove-Item $_.FullName -Force
                    }
                    else {
                        Add-Content -Path $logFile -Value "$data Ошибка архивации файла: $($_.FullName)"
                    }
                }
                catch {
                    $errorMessage = $_.Exception.Message
                    Write-Host "Ошибка: $errorMessage"
                    Add-Content -Path $logFile -Value "$data Ошибка: $errorMessage"
                }
            } 
        }
    }
}