首页 > 解决方案 > 使用 powershell 创建 zip

问题描述

我想使用 powershell 制作多个 zip 文件。示例:我有一个包含多个文件的文件夹,我希望将它们压缩成 4 个包。

有人可以告诉我这是否可能,如果可以,该怎么做?

谢谢

标签: powershellzip

解决方案


您可以将文件分组为块,可以使用hello{number}.txt.

$counter = 0

$groups = Get-ChildItem -Path .\helloFolder |
    Sort-Object -Property @{Expression = { [int][System.IO.Path]::GetFileNameWithoutExtension($_.Name).TrimStart("hello") } } |
        Group-Object -Property { [System.Math]::Floor($Script:counter++ / 4) }

为了正确排序,我们需要从文件名中提取数字前缀。我们可以使用System.IO.Path.GetFileNameWithoutExtension()来获取文件名,然后hello使用 . 从字符串的开头剥离System.String.TrimStart(). 然后我们可以将其转换为[int]并将其用作 的排序属性Sort-Object。这将确保文件按前缀排序,因为如果您仅按文件名排序,喜欢的文件hello10.txt自然会先排序。hello3.txt

要对文件进行分组,我们可以将计数器除以4,然后使用 向下取整System.Math.Floor()。然后我们可以将属性与Group-Object.

为了更详细地解释这一点,如果我们有 8 个文件,这将进行以下分组:

# Group 1
hello1.txt -> floor(0 / 4) = 0
hello2.txt -> floor(1 / 4) = 0
hello3.txt -> floor(2 / 4) = 0
hello4.txt -> floor(3 / 4) = 0

# Group 2
hello5.txt -> floor(4 / 4) = 1
hello6.txt -> floor(5 / 4) = 1
hello7.txt -> floor(6 / 4) = 1
hello8.txt -> floor(7 / 4) = 1 

它还可以处理剩余块的大小小于 4 的情况,因为它们将被添加到下一个可用组中。

然后我们可以将分块文件归档到zipfile{number}.zipusing 中,它可以接受来自Compress-Archive的路径数组。[-Path] <string[]>$group.Group.FullName

foreach ($group in $groups) {
    Compress-Archive -Path $group.Group.FullName -DestinationPath "zipfile$([int]$group.Name + 1).zip"
}

如果您愿意,也可以将上述所有内容组合到一个管道中:

Get-ChildItem -Path .\helloFolder |
    Sort-Object -Property @{Expression = { [int][System.IO.Path]::GetFileNameWithoutExtension($_.Name).TrimStart("hello") } } |
        Group-Object -Property { [System.Math]::Floor($Script:counter++ / 4) } |
            ForEach-Object {
                Compress-Archive -Path $group.Group.FullName -DestinationPath "zipfile$([int]$group.Name + 1).zip"
            }

推荐阅读