【问题标题】:using 7zip to zip in powershell 5.0使用 7zip 压缩 powershell 5.0
【发布时间】:2021-01-26 20:43:31
【问题描述】:

我已经自定义了一个 powershell 代码来将超过 7 天的文件从源文件夹压缩到子文件夹,然后在压缩完成后从源文件中删除原始文件。该代码在文件量较少的内置 Compress-Archive 和 Remove-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 sz "$env:ProgramFiles\7-Zip\7z.exe" 

$Date = Get-Date -format yyyy-MM-dd_HH-mm 
$Source = "C:\Users\529817\New folder1\New folder_2\" 
$Target = "C:\Users\529817\New folder1\New folder_2\ARCHIVE\"
Get-ChildItem -path $Source | sz a -mx=9 -sdel $Target\$Date.7z $Source

【问题讨论】:

    标签: powershell scripting 7zip ziparchive


    【解决方案1】:

    这里有几个问题。首先是 7-Zip 不接受文件列表作为管道,此外,即使它接受了,您的 GCI 也会选择每个文件而不是按日期选择。它完全起作用的原因是您将源文件夹作为参数传递给 7-Zip。

    7-Zip 接受要压缩的文件列表作为命令行参数:

    Usage: 7z <command> [<switches>...] <archive_name> [<file_names>...] [@listfile]
    

    您可以通过按 LastWriteTime 过滤 GCI 的输出来选择所需的文件。

    试着把你的最后一行改成这个

    sz a -mx=9 -sdel $Target\$Date.7z (gci -Path $Source |? LastWriteTime -lt (Get-Date).AddDays(-7) | select -expandproperty FullName)
    

    如果您有数百个文件和长路径,那么您可能会遇到命令行长度问题,在这种情况下您可以这样做:

    gci -Path $Source |? LastWriteTime -lt (Get-Date).AddDays(-7) |% { sz a -mx=9 -sdel $Target\$Date.7z $_.FullName }
    

    考虑一个包含需要压缩的文件列表的临时文件:-

    $tmp = "$($(New-Guid).guid).tmp"
    set-content $tmp (gci -Path $Source |? LastWriteTime -lt (Get-Date).AddDays(-7)).FullName
    sz a -mmt=8 out.7z @$tmp
    Remove-Item $tmp
    

    同时查看 7-Zip 的参数:-mx=9 将是最慢的,可能会获得较小的尺寸增益。或许可以忽略该参数并采用默认值并考虑添加-mmt=8 以使用多个线程。

    【讨论】:

    • 我试过这个。遗憾的是,这是一个非常缓慢的过程。即使 100 个文件也需要更长的时间。我正在寻找更快的方法,因为我的文件夹每周有 8000 多个文件进行归档。
    • 我已经更新了我的答案,包括一种可能更快的方法来处理很长的文件列表以及对 7-Zip 命令行的优化。
    • 非常感谢。这种方法效果很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多