微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用powershell压缩

如何解决使用powershell压缩

我编写了代码,将超过 7 天的文件从源文件夹压缩到子文件夹,然后删除原始文件。我的代码最适合文件较少的 Compress-ArchiveRemove-Item cmdlet,但处理大量文件需要更多时间和系统内存。 所以,我正在研究使用 7zip 的解决方案,因为它更快。

下面的代码可以正确压缩,但不限于超过 7 天的文件,并从源文件夹中删除所有文件。它应该只压缩和删除超过 7 天的文件

代码有问题吗。

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

$Days = "7"
$Date = Get-Date -format yyyy-MM-dd_HH-mm
$limit = (Get-Date).AddDays(-$Days)

$filePath = "C:\Users\529817\New folder1\New folder_2" 
 
Where LastWriteTime -lt $limit | 7z a -t7z -sdel "C:\Users\529817\New folder1\New folder_2\ARCHIVE\$Date.7z" "$filePath" 

解决方法

我认为您没有正确运行 7zip 命令。您只是告诉它将目录 $filepath 中的所有文件添加到存档中,然后删除所有文件。我非常怀疑 7zip 是否可以像您的示例所建议的那样接受管道输入。

看看 examples from 7Zip cmdline help

7z a archive1.zip subdir\

所有文件和子文件夹从文件夹 subdir 添加到存档 archive1.zip。存档中的文件名将包含 subdir\ 前缀。

7z a archive2.zip .\subdir\*

将文件夹 subdir 中的所有文件和子文件夹添加到存档 archive2.zip。存档中的文件名将不包含 subdir\ 前缀。

我必须下载 7Zip 进行测试,但我认为您需要一个循环来处理您使用 Where 子句隔离的文件。它可能看起来像:

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

$Days = "7"
$Date = Get-Date -format yyyy-MM-dd_HH-mm
$limit = (Get-Date).AddDays(-$Days)

$filePath = "C:\Users\529817\New folder1\New folder_2" 

Get-ChildItem $filePath |
Where-Object{ $_.LastWriteTime -lt $limit } | 
ForEach-Object{
    7z a -t7z -sdel "C:\Users\529817\New folder1\New folder_2\ARCHIVE\$Date.7z" $_.FullName
}

注意:至少在您的示例中,您缺少 Get-ChildItem 命令。我认为您不需要从 .Date 方法返回的 [DateTime] 对象中引用 .AddDays() 属性,除非您希望边界为该日期的午夜。否则 .AddDays() 将自然返回 [DateTime]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。