使用powershell获取许多zip文件的未压缩大小

xmq68pz9  于 2023-10-18  发布在  Shell
关注(0)|答案(2)|浏览(139)

我需要解压缩磁盘中的一系列zip文件。它们有很多数据,所以我需要验证是否有足够的可用空间。有没有一种方法可以在不解压缩的情况下使用Powershell找到zip文件内容的未压缩大小?这样我就可以计算每个zip文件的未压缩大小,将它们相加,并检查我的可用空间是否大于这个值。

wfsdck30

wfsdck301#

这个函数可以做到这一点:

function Get-UncompressedZipFileSize {

    param (
        $Path
    )

    $shell = New-Object -ComObject shell.application
    $zip = $shell.NameSpace($Path)
    $size = 0
    foreach ($item in $zip.items()) {
        if ($item.IsFolder) {
            $size += Get-UncompressedZipFileSize -Path $item.Path
        } else {
            $size += $item.size
        }
    }

    # It might be a good idea to dispose the COM object now explicitly, see comments below
    [System.Runtime.InteropServices.Marshal]::ReleaseComObject([System.__ComObject]$shell) | Out-Null
    [System.GC]::Collect()
    [System.GC]::WaitForPendingFinalizers()

    return $size
}

示例用法:

$zipFiles = Get-ChildItem -Path "C:\path\to\zips" -Include *.zip -Recurse
foreach ($zipFile in $zipFiles) {
    Select-Object @{n='FullName'; e={$zipFile.FullName}}, @{n='Size'; e={Get-UncompressedZipFileSize -Path $zipFile.FullName}} -InputObject ''
}

示例输出:

FullName                                Size
--------                                ----
C:\test1.zip                         4334400
C:\test2.zip                         8668800
C:\test3.zip                         8668800
g6ll5ycj

g6ll5ycj2#

找到了另一种方法,不依赖于外部程序,不关心你是否禁用了zip文件夹查看文件资源管理器,是一个数量级的速度更快。
https://devblogs.microsoft.com/scripting/powertip-use-powershell-to-read-the-content-of-a-zip-file/

Add-Type -assembly "system.io.compression.filesystem"
[io.compression.zipfile]::OpenRead($zipfile).Entries.Length | Measure-Object -Sum

Count    : 171
Average  :
Sum      : 13419132548
Maximum  :
Minimum  :
Property :
Measure-Command {
[io.compression.zipfile]::OpenRead(($zipfile)).Entries.length| Measure-Object -Sum
}

Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 0
Milliseconds      : 10
Ticks             : 103734
TotalDays         : 1.200625E-07
TotalHours        : 2.8815E-06
TotalMinutes      : 0.00017289
TotalSeconds      : 0.0103734
TotalMilliseconds : 10.3734
Measure-Command {
Select-Object @{n='FullName'; e={$zipFile.FullName}}, @{n='Size'; e={Get-UncompressedZipFileSize -Path $zipFile.FullName}} -InputObject ''
}

Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 0
Milliseconds      : 414
Ticks             : 4146517
TotalDays         : 4.79920949074074E-06
TotalHours        : 0.000115181027777778
TotalMinutes      : 0.00691086166666667
TotalSeconds      : 0.4146517
TotalMilliseconds : 414.6517

相关问题