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

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