我怎么能够移动在 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 文件。