我编写了下面的PowerShell脚本来压缩超过30天的日志:
$LastWrite=(get-date).AddDays(-30).ToString("MM/dd/yyyy")
Get-ChildItem -Filter "server.log*" -Recurse -File | Where-Object
{$_.LastWriteTime -le $LastWrite}
现在,我无法在PowerShell中获得压缩命令,通过该命令我可以压缩(zip/tar)超过30天的server.log * 文件。希望通过在上面的命令中添加管道符号来使用单个命令。
2条答案
按热度按时间mf98qq941#
如果您有PowerShell版本5或更高版本,则可以使用
Compress-Archive
cmdlet压缩文件:zpqajqem2#
如果您使用的是旧版本的Powershell,则可以使用ZipFileExtensions的CreateEntryFromFile方法,但是如果您想要一个健壮的脚本,并且无人值守,则需要考虑很多事项。
在测试为此目的开发的script的几个月中,我遇到了一些问题,这些问题使这个小问题变得更加复杂:
1.是否会锁定任何文件?如果锁定,CreateEntryFromFile可能会失败。
1.你知道你可以在一个Zip压缩文件中拥有同一个文件的多个副本吗?因为你不能把它们放在同一个文件夹中,所以很难提取它们。我的脚本会检查文件路径和存档文件的时间戳(+/- 2秒,因为Zip格式中丢失了日期精度),以确定它是否已经被存档,并且不会创建副本。
1.文件是在夏令时时区创建的吗?Zip格式不保留该属性,在解压缩时可能会损失或增加一个小时。
1.如果原始文件已成功存档,是否要将其删除?
1.如果由于文件锁定/丢失或路径过长而导致失败,是否应继续该过程?
1.任何错误都会给你留下一个不可用的zip文件吗?你需要Dispose()来完成它。
1.你想保留多少个压缩包?我喜欢每个运行月一个,在现有压缩包中添加新条目。
1.是否要保留相对路径?这样做将部分消除zip文件内的重复问题。
如果您不关心这些问题,并且您有Powershell 5,Mark Wragg的脚本应该可以工作,但是它为每个日志创建一个zip,这可能不是您想要的。
以下是脚本的当前版本-以防GitHub不可用:
下面的命令行将压缩当前文件夹下超过30天的所有server.log* 文件: