首页 > 解决方案 > 7zip 将相同日期的文件压缩为一个

问题描述

我有一个包含多个不同日期的 .log 文件的目录。例如,abc_10_28_2020.log、2_abc_10_28_2020.log、abc_10_27_2020.log 等。我一直在尝试编写一个压缩 PowerShell 脚本,以每天将相同日期的日志文件压缩到 1 个 zip 文件中。我发现使用 7zip 取得了一些成功,因为我的 PowerShell 版本不是 v5。但是,我的问题是,在尝试压缩当天的日志时,我不知道如何按昨天的日期进行过滤。

到目前为止,我的代码可以将所有 abc 文件压缩成一个 zip,但我无法按日期过滤。

$yesterday = [DateTime]::Today.AddDays(-2).ToString("yyyy_MM_dd")
$path = "C:\Users\Sample\TEST\"
$newname = "test.zip"

if (-not (test-path "$env:ProgramFiles\7-Zip\7z.exe")) {
throw "$env:ProgramFiles\7-Zip\7z.exe needed"
}

set-alias sz "$env:ProgramFiles\7-Zip\7z.exe"

cd "C:\Users\Sample\TEST\"

sz a -tzip "$newname" $path.Fullname -i!*abc*.log 

所以在上面的例子中,我可以按abc过滤,但不能按日期过滤。我不相信 7zip 命令会允许$yesterday因为这对我不起作用。

标签: powershellzip7zip

解决方案


我想您的日志文件都具有相同的日期格式?还有,为什么昨天AddDays(-2)想写呢?我想你的意思是AddDays(-1)

仅获取昨天的文件的一种非常简单的方法是通配符过滤器:

$filter = (Get-Date).AddDays(-1).ToString("MM_dd_yyyy")
$files = Get-ChildItem $path -Filter "*$filter.log"

或者,如果您只想要超过 1 天的文件,您可以执行以下操作:

$today = (Get-Date).Date
Get-ChildItem $path | where {
   ($today - [DateTime]($_.Name -replace '.*(\d{2})_(\d{2})_(\d{4}).*', '$3-$1-$2')).TotalDays -ge 1
}

推荐阅读