powershell 从日志文件创建 zip

powershell 从日志文件创建 zip

我怎么能够移动在 PowerShell 中使用 System.IO.Compression.FileSystem 将日志文件压缩到 zip 档案中?

我有更多包含每个应用程序日志文件的文件夹:

app1logfolder
|-app1_20130507.log
|-app1_20130508.log
|-app1_20130509.log

app2logfolder
|-app2_20130507.log
|-app2_20130508.log
|-app2_20130509.log

等等...并且我想每天将这些文件处理成一个 zip 存档。

logs_20130507.zip
|-app1_20130507.log
|-app2_20130507.log

logs_20130508.zip
|-app1_20130508.log
|-app2_20130508.log

logs_20130509.zip
|-app1_20130509.log
|-app2_20130509.log

答案1

使用 Shell.Application 对象将消除临时文件。此外,您无需担心是否安装了 NET 4.5。此对象自 Windows XP 起可用。

以下代码假设您所有的应用程序日志文件夹都位于一个文件夹中。它将查找与日期(今天)匹配的日志文件,创建一个 zip 文件并将文件复制到其中。zip 文件也将根据当前日期命名。

$date_string = Get-Date -Format 'yyyyMMdd'

$zip_filename = "logs_$date_string.zip"

# Create the empty zip file
Set-Content $zip_filename ( [byte[]] @( 80, 75, 5, 6 + (, 0 * 18 ) ) ) -Encoding Byte

$zip_file = Get-Item -Path $zip_filename | ForEach-Object { 

    (New-Object -ComObject Shell.Application).NameSpace($_.FullName) 
}

[array]$log_files = Get-ChildItem -Recurse -Filter "*_$date_string.log"

for ($i=1; $i -le $log_files.Count; $i++) {

    $zip_file.CopyHere($log_files[$i-1].FullName)

    # Copying is async so we need to check if it is done before continuing.
    while ($zip_file.Items().Count -ne $i) { sleep 0.1 }

}

我的假设可能是错误的,您可能需要进行一些更改才能使其适用于您的环境。本示例的关键点是使用 Shell.Application 对象创建 zip 文件。

答案2

我不明白你为什么要特意移动这些文件。你总是可以压缩它们,验证是否正确完成,最后删除这些文件。

为了使其在 Powershell 中运行,您需要 .NET 4.5 CLR,因为该类是该版本中的新类。

# load the assembly required
[Reflection.Assembly]::LoadWithPartialName("System.IO.Compression.FileSystem")
$sourceFolder = "C:\Path\To\Your\Logs"
$destinationFile = "C:\Path\To\Your\Destination.zip"    
# desired compression level (Optimal, Fastest or NoCompression)
$compressionLevel = [System.IO.Compression.CompressionLevel]::Optimal
# include the directory $sourceFolder or just it's contents
$includeBaseDirectory = $false

[System.IO.Compression.ZipFile]::CreateFromDirectory($sourceFolder, $destinationFile, $compressionLevel , $includeBaseDirectory)

如果在最后一次方法调用后得到结果Unable to find type [System.IO.Compression.ZipFile]: make sure that the assembly containing this type is loaded.,则意味着您没有安装 .NET 4.5 CLR(或者从 GAC 加载了错误的程序集)。

答案3

假设您有 .NET 4.5 CLR,您想使用从文件创建条目方法是一次一个日志文件地构建你的 zip 文件。

相关内容