Compress-IISLogs.ps1
<#PSScriptInfo
.VERSION 1.0 .GUID cd35b292-e0b9-4a6e-9cb5-94345e5a5108 .AUTHOR Vasily Larionov .COMPANYNAME .COPYRIGHT .TAGS Compress,Log .LICENSEURI .PROJECTURI https://github.com/vlariono/posh-scripts .ICONURI .EXTERNALMODULEDEPENDENCIES .REQUIREDSCRIPTS .EXTERNALSCRIPTDEPENDENCIES .RELEASENOTES #> <# .SYNOPSIS Performs gzip compression of IIS logs .DESCRIPTION Rotates IIS logs. Reads original logs from source directory and saves compressed logs to destination directory. The original files will be deleted after compression. The script won't rotate files which have been modified today. .PARAMETER SourceDirectory Source directory to read files from .PARAMETER DestinationDirectory Destination directory to write archives to .EXAMPLE .\Compress-IISLogs.ps1 -SourceDirectory D:\Log -DestinationDirectory D:\Archive #> #region Params param( [Parameter(Position=0, Mandatory=$true)] [ValidateScript({Test-Path -Path $_ -PathType 'container'})] [System.String] $SourceDirectory, [Parameter(Position=1, Mandatory=$true)] [ValidateNotNullOrEmpty()] [System.String] $DestinationDirectory ) #endregion function Compress-File{ #region Params param( [Parameter(Position=0, Mandatory=$true)] [ValidateScript({Test-Path -Path $_ -PathType 'leaf'})] [System.String] $InputFile, [Parameter(Position=1, Mandatory=$true)] [ValidateNotNullOrEmpty()] [System.String] $OutputFile ) #endregion try{ #Creating buffer with size 8MB $bytesGZipFileBuffer = New-Object -TypeName byte[](8192) $streamGZipFileInput = New-Object -TypeName System.IO.FileStream($InputFile,[System.IO.FileMode]::Open,[System.IO.FileAccess]::Read) $streamGZipFileOutput = New-Object -TypeName System.IO.FileStream($OutputFile,[System.IO.FileMode]::Create,[System.IO.FileAccess]::Write) $streamGZipFileArchive = New-Object -TypeName System.IO.Compression.GZipStream($streamGZipFileOutput,[System.IO.Compression.CompressionMode]::Compress) for($iBytes = $streamGZipFileInput.Read($bytesGZipFileBuffer, 0,$bytesGZipFileBuffer.Count); $iBytes -gt 0; $iBytes = $streamGZipFileInput.Read($bytesGZipFileBuffer, 0,$bytesGZipFileBuffer.Count)){ $streamGZipFileArchive.Write($bytesGZipFileBuffer,0,$iBytes) } $streamGZipFileArchive.Dispose() $streamGZipFileInput.Close() $streamGZipFileOutput.Close() Get-Item $OutputFile } catch { throw $_ } } Get-ChildItem -Path $SourceDirectory -Recurse -Exclude "*.gz"|ForEach-Object{ if($($_.Attributes -band [System.IO.FileAttributes]::Directory) -ne [System.IO.FileAttributes]::Directory){ #Current file $curFile = $_ #Check the file wasn't modified today if($curFile.LastWriteTime.Date -ne [System.DateTime]::Today){ $containedDir=$curFile.Directory.FullName.Replace($SourceDirectory,$DestinationDirectory) #if target directory doesn't exist - create if($(Test-Path -Path "$containedDir") -eq $false){ New-Item -Path "$containedDir" -ItemType directory } Write-Host $("Archiving " + $curFile.FullName) Compress-File -InputFile $curFile.FullName -OutputFile $("$containedDir\" + $curFile.Name + ".gz") Remove-Item -Path $curFile.FullName } } } |