ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 실무에서 바로 쓰는 PowerShell 압축 자동화 스크립트 모음
    [프로그램] 2025. 8. 6. 11:30
    728x90

    PowerShell Compress-Archive 실무 자동화 스크립트

    이전 포스팅에서 PowerShell의 Compress-Archive 기본 사용법을 알아봤다면, 이번에는 실제 업무 환경에서 바로 활용할 수 있는 완성된 자동화 스크립트들을 소개합니다. 로그 파일 백업부터 프로젝트 배포 패키지 생성까지, 복사해서 바로 사용할 수 있는 실용적인 스크립트들을 준비했습니다.

    🗂️ 로그 파일 백업 자동화 스크립트

    기본 로그 백업 스크립트

    웹 서버나 애플리케이션의 로그 파일을 정기적으로 백업하는 스크립트입니다.

    # LogBackup.ps1
    param(
        [string]$LogPath = "C:\logs",
        [string]$BackupPath = "C:\backup\logs",
        [int]$DaysToKeep = 30
    )
    
    # 백업 폴더가 없으면 생성
    if (!(Test-Path $BackupPath)) {
        New-Item -ItemType Directory -Path $BackupPath -Force
    }
    
    # 현재 날짜로 백업 파일명 생성
    $backupDate = Get-Date -Format "yyyy-MM-dd_HH-mm"
    $backupFileName = "logs_backup_$backupDate.zip"
    $backupFullPath = Join-Path $BackupPath $backupFileName
    
    # 로그 파일들을 압축
    try {
        Write-Host "로그 백업 시작: $LogPath" -ForegroundColor Green
        
        # 지난 24시간 동안의 로그 파일만 백업
        $cutoffTime = (Get-Date).AddDays(-1)
        $logFiles = Get-ChildItem -Path $LogPath -Filter "*.log" | Where-Object {
            $_.LastWriteTime -gt $cutoffTime
        }
        
        if ($logFiles.Count -gt 0) {
            $logFiles | Compress-Archive -DestinationPath $backupFullPath -CompressionLevel Optimal
            Write-Host "백업 완료: $backupFileName (파일 수: $($logFiles.Count))" -ForegroundColor Green
            
            # 로그 파일 기록
            $logEntry = "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss'): 백업 성공 - $backupFileName ($($logFiles.Count)개 파일)"
            Add-Content -Path (Join-Path $BackupPath "backup.log") -Value $logEntry
        } else {
            Write-Host "백업할 로그 파일이 없습니다." -ForegroundColor Yellow
        }
        
        # 오래된 백업 파일 정리
        $oldBackups = Get-ChildItem -Path $BackupPath -Filter "logs_backup_*.zip" | 
                      Where-Object { $_.CreationTime -lt (Get-Date).AddDays(-$DaysToKeep) }
        
        foreach ($oldBackup in $oldBackups) {
            Remove-Item $oldBackup.FullName -Force
            Write-Host "오래된 백업 파일 삭제: $($oldBackup.Name)" -ForegroundColor Yellow
        }
        
    } catch {
        $errorMsg = "백업 실패: $($_.Exception.Message)"
        Write-Host $errorMsg -ForegroundColor Red
        Add-Content -Path (Join-Path $BackupPath "backup.log") -Value "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss'): $errorMsg"
    }
    

    고급 로그 백업 스크립트 (여러 서버)

    여러 서버나 애플리케이션의 로그를 한 번에 백업하는 스크립트입니다.

    # MultiServerLogBackup.ps1
    
    # 백업 대상 서버 및 경로 설정
    $servers = @(
        @{ Name = "WebServer"; Path = "C:\inetpub\logs\LogFiles" },
        @{ Name = "AppServer"; Path = "C:\Program Files\MyApp\logs" },
        @{ Name = "DatabaseServer"; Path = "C:\Program Files\Microsoft SQL Server\MSSQL\Log" }
    )
    
    $centralBackupPath = "\\BackupServer\Backups\Logs"
    $backupDate = Get-Date -Format "yyyy-MM-dd"
    
    foreach ($server in $servers) {
        try {
            Write-Host "처리 중: $($server.Name)" -ForegroundColor Cyan
            
            if (Test-Path $server.Path) {
                $serverBackupPath = Join-Path $centralBackupPath $server.Name
                if (!(Test-Path $serverBackupPath)) {
                    New-Item -ItemType Directory -Path $serverBackupPath -Force
                }
                
                $backupFileName = "$($server.Name)_logs_$backupDate.zip"
                $backupFullPath = Join-Path $serverBackupPath $backupFileName
                
                # 오늘 생성된 로그 파일만 백업
                $todayLogs = Get-ChildItem -Path $server.Path -Recurse -File | 
                            Where-Object { $_.CreationTime.Date -eq (Get-Date).Date }
                
                if ($todayLogs.Count -gt 0) {
                    $todayLogs | Compress-Archive -DestinationPath $backupFullPath -CompressionLevel Optimal
                    Write-Host "완료: $($server.Name) - $($todayLogs.Count)개 파일 백업" -ForegroundColor Green
                }
            } else {
                Write-Host "경로 없음: $($server.Path)" -ForegroundColor Yellow
            }
        } catch {
            Write-Host "오류 발생: $($server.Name) - $($_.Exception.Message)" -ForegroundColor Red
        }
    }
    

    📦 프로젝트 배포 패키지 생성 스크립트

    웹 프로젝트 배포 패키지 생성

    웹 애플리케이션을 배포하기 위한 클린한 패키지를 생성하는 스크립트입니다.

    # WebDeployPackage.ps1
    param(
        [Parameter(Mandatory=$true)]
        [string]$ProjectPath,
        [string]$OutputPath = "C:\Deploy",
        [string]$ProjectName = "WebApp"
    )
    
    # 제외할 파일/폴더 パターン
    $excludePatterns = @(
        "*.pdb",
        "*.tmp",
        "*.log",
        "bin\Debug",
        "obj",
        "packages",
        ".vs",
        ".git",
        "node_modules",
        "*.config.backup"
    )
    
    # 배포 패키지 생성 함수
    function New-DeploymentPackage {
        param($SourcePath, $DestPath, $ExcludeList)
        
        Write-Host "프로젝트 배포 패키지 생성 시작" -ForegroundColor Green
        Write-Host "소스: $SourcePath" -ForegroundColor Cyan
        Write-Host "대상: $DestPath" -ForegroundColor Cyan
        
        # 임시 폴더 생성
        $tempPath = Join-Path $env:TEMP "deploy_temp_$(Get-Random)"
        New-Item -ItemType Directory -Path $tempPath -Force | Out-Null
        
        try {
            # 필요한 파일만 복사
            $allFiles = Get-ChildItem -Path $SourcePath -Recurse -File
            $filteredFiles = $allFiles | Where-Object {
                $file = $_
                $shouldExclude = $false
                
                foreach ($pattern in $ExcludeList) {
                    if ($file.FullName -like "*$pattern*") {
                        $shouldExclude = $true
                        break
                    }
                }
                return -not $shouldExclude
            }
            
            Write-Host "복사할 파일 수: $($filteredFiles.Count)" -ForegroundColor Yellow
            
            foreach ($file in $filteredFiles) {
                $relativePath = $file.FullName.Substring($SourcePath.Length + 1)
                $destFile = Join-Path $tempPath $relativePath
                $destDir = Split-Path $destFile -Parent
                
                if (!(Test-Path $destDir)) {
                    New-Item -ItemType Directory -Path $destDir -Force | Out-Null
                }
                
                Copy-Item $file.FullName $destFile
            }
            
            # 배포 정보 파일 생성
            $deployInfo = @{
                PackageDate = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
                ProjectName = $ProjectName
                SourcePath = $SourcePath
                FileCount = $filteredFiles.Count
                ExcludedPatterns = $excludePatterns
            }
            
            $deployInfo | ConvertTo-Json | Out-File -FilePath (Join-Path $tempPath "deploy-info.json") -Encoding UTF8
            
            # 압축 파일 생성
            $deployDate = Get-Date -Format "yyyy-MM-dd_HH-mm"
            $packageName = "$ProjectName`_deploy_$deployDate.zip"
            $packagePath = Join-Path $OutputPath $packageName
            
            if (!(Test-Path $OutputPath)) {
                New-Item -ItemType Directory -Path $OutputPath -Force
            }
            
            Compress-Archive -Path "$tempPath\*" -DestinationPath $packagePath -CompressionLevel Optimal
            
            Write-Host "배포 패키지 생성 완료: $packageName" -ForegroundColor Green
            Write-Host "파일 크기: $([math]::Round((Get-Item $packagePath).Length / 1MB, 2)) MB" -ForegroundColor Green
            
            return $packagePath
            
        } finally {
            # 임시 폴더 정리
            if (Test-Path $tempPath) {
                Remove-Item $tempPath -Recurse -Force
            }
        }
    }
    
    # 스크립트 실행
    try {
        if (!(Test-Path $ProjectPath)) {
            throw "프로젝트 경로를 찾을 수 없습니다: $ProjectPath"
        }
        
        $packagePath = New-DeploymentPackage -SourcePath $ProjectPath -DestPath $OutputPath -ExcludeList $excludePatterns
        
        # 로그 기록
        $logEntry = "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss'): 배포 패키지 생성 성공 - $(Split-Path $packagePath -Leaf)"
        Add-Content -Path (Join-Path $OutputPath "deploy.log") -Value $logEntry
        
    } catch {
        $errorMsg = "배포 패키지 생성 실패: $($_.Exception.Message)"
        Write-Host $errorMsg -ForegroundColor Red
        Add-Content -Path (Join-Path $OutputPath "deploy.log") -Value "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss'): $errorMsg"
    }
    

    API 프로젝트 배포 패키지 생성

    API 서버 배포를 위한 특화된 스크립트입니다.

    # ApiDeployPackage.ps1
    param(
        [Parameter(Mandatory=$true)]
        [string]$ApiProjectPath,
        [string]$ConfigPath = "",
        [string]$OutputPath = "C:\ApiDeploy"
    )
    
    function New-ApiDeploymentPackage {
        Write-Host "API 배포 패키지 생성 중..." -ForegroundColor Green
        
        # API 전용 제외 패턴
        $apiExcludePatterns = @(
            "*.pdb", "*.tmp", "*.log", "bin\Debug", "obj", 
            "packages", ".vs", ".git", "Tests", "*.Test.*",
            "appsettings.Development.json", "web.Debug.config"
        )
        
        $deployDate = Get-Date -Format "yyyy-MM-dd_HH-mm"
        $packageName = "API_deploy_$deployDate.zip"
        $tempPath = Join-Path $env:TEMP "api_deploy_$(Get-Random)"
        
        try {
            New-Item -ItemType Directory -Path $tempPath -Force | Out-Null
            
            # 프로덕션 빌드 파일 복사
            $buildPath = Join-Path $ApiProjectPath "bin\Release"
            if (Test-Path $buildPath) {
                Copy-Item "$buildPath\*" $tempPath -Recurse -Force
            }
            
            # 설정 파일 복사
            $configFiles = @("appsettings.json", "web.config", "Global.asax")
            foreach ($configFile in $configFiles) {
                $configSource = Join-Path $ApiProjectPath $configFile
                if (Test-Path $configSource) {
                    Copy-Item $configSource $tempPath
                }
            }
            
            # 외부 설정 파일이 지정된 경우
            if ($ConfigPath -and (Test-Path $ConfigPath)) {
                Copy-Item "$ConfigPath\*" $tempPath -Force
            }
            
            # 배포 스크립트 생성
            $deployScript = @"
    @echo off
    echo API 배포 시작...
    net stop "MyApiService" 2>nul
    timeout /t 5
    xcopy /Y /E /I *.* "C:\inetpub\wwwroot\MyApi\"
    net start "MyApiService"
    echo 배포 완료!
    pause
    "@
            $deployScript | Out-File -FilePath (Join-Path $tempPath "deploy.bat") -Encoding ASCII
            
            # 압축 생성
            $packagePath = Join-Path $OutputPath $packageName
            if (!(Test-Path $OutputPath)) {
                New-Item -ItemType Directory -Path $OutputPath -Force
            }
            
            Compress-Archive -Path "$tempPath\*" -DestinationPath $packagePath -CompressionLevel Optimal
            
            Write-Host "API 배포 패키지 생성 완료: $packageName" -ForegroundColor Green
            
        } finally {
            if (Test-Path $tempPath) {
                Remove-Item $tempPath -Recurse -Force
            }
        }
    }
    
    New-ApiDeploymentPackage
    

    🔧 스크립트 실행 방법

    수동 실행

    PowerShell에서 직접 실행:

    # 매개변수 없이 실행
    .\LogBackup.ps1
    
    # 매개변수와 함께 실행
    .\LogBackup.ps1 -LogPath "D:\logs" -BackupPath "E:\backup" -DaysToKeep 60
    
    # 배포 패키지 생성
    .\WebDeployPackage.ps1 -ProjectPath "C:\Projects\MyWebApp" -ProjectName "MyWebApp"
    

    배치 파일을 통한 실행

    각 스크립트를 쉽게 실행할 수 있도록 배치 파일을 생성할 수 있습니다.

    로그 백업용 배치 파일 (LogBackup.bat):

    @echo off
    echo ==========================================
    echo         로그 파일 백업 시작
    echo ==========================================
    
    cd /d "%~dp0"
    powershell.exe -ExecutionPolicy Bypass -File "LogBackup.ps1" -LogPath "C:\logs" -BackupPath "C:\backup\logs"
    
    if %ERRORLEVEL% EQU 0 (
        echo 백업이 성공적으로 완료되었습니다.
    ) else (
        echo 백업 중 오류가 발생했습니다.
    )
    
    echo ==========================================
    pause
    

    웹 배포 패키지 생성용 배치 파일 (WebDeploy.bat):

    @echo off
    set PROJECT_PATH=C:\Projects\MyWebApp
    set PROJECT_NAME=MyWebApp
    set OUTPUT_PATH=C:\Deploy
    
    echo ==========================================
    echo      웹 배포 패키지 생성 시작
    echo ==========================================
    echo 프로젝트: %PROJECT_NAME%
    echo 소스: %PROJECT_PATH%
    echo 출력: %OUTPUT_PATH%
    echo ==========================================
    
    cd /d "%~dp0"
    powershell.exe -ExecutionPolicy Bypass -File "WebDeployPackage.ps1" -ProjectPath "%PROJECT_PATH%" -ProjectName "%PROJECT_NAME%" -OutputPath "%OUTPUT_PATH%"
    
    if %ERRORLEVEL% EQU 0 (
        echo 배포 패키지가 성공적으로 생성되었습니다.
        start "" "%OUTPUT_PATH%"
    ) else (
        echo 패키지 생성 중 오류가 발생했습니다.
    )
    
    echo ==========================================
    pause
    

    📝 기본 로깅 기능

    모든 스크립트에는 기본적인 로깅 기능이 포함되어 있습니다:

    로그 파일 구조

    2025-07-30 09:15:23: 백업 시작 - C:\logs
    2025-07-30 09:15:45: 백업 성공 - logs_backup_2025-07-30_09-15.zip (127개 파일)
    2025-07-30 09:15:46: 오래된 백업 파일 삭제 - logs_backup_2025-06-30_09-15.zip
    2025-07-30 14:22:10: 배포 패키지 생성 성공 - MyWebApp_deploy_2025-07-30_14-22.zip
    

    로그 확인 스크립트

    # ViewLogs.ps1 - 로그 파일 조회 스크립트
    param(
        [string]$LogPath = "C:\backup\logs\backup.log",
        [int]$LastLines = 50
    )
    
    if (Test-Path $LogPath) {
        Write-Host "최근 $LastLines 줄의 로그:" -ForegroundColor Green
        Get-Content $LogPath | Select-Object -Last $LastLines
    } else {
        Write-Host "로그 파일을 찾을 수 없습니다: $LogPath" -ForegroundColor Red
    }
    

    🔄 다음 포스팅 예고

    다음 포스팅에서는 더욱 고급화된 자동화 기능들을 다룰 예정입니다:

    • JSON 설정 파일 기반의 유연한 스크립트 구성
    • Windows 이벤트 로그 연동 및 시스템 알림
    • 작업 스케줄러 연동으로 완전 자동화
    • 이메일 알림Slack 웹훅 연동
    • 에러 복구재시도 로직 구현

    🎯 마무리

    이번 포스팅에서 소개한 스크립트들은 실제 업무 환경에서 바로 사용할 수 있도록 구성했습니다. 각 스크립트는 복사해서 환경에 맞게 경로만 수정하면 즉시 활용 가능하며, 기본적인 에러 처리와 로깅 기능도 포함되어 있습니다.

    PowerShell의 Compress-Archive를 활용한 자동화는 시스템 관리자와 개발자의 반복적인 작업을 크게 줄여주는 강력한 도구입니다. 다음 포스팅에서는 이러한 기본 스크립트를 더욱 발전시켜 엔터프라이즈 환경에서도 안정적으로 운영할 수 있는 고급 기능들을 소개하겠습니다.

    728x90

    댓글

Designed by Tistory.