我有一堆想要压缩的文件,我需要一个脚本来递归地遍历目录并查找所有名为 test*.txt 的文件作为示例。
这是最简单的部分,所以我使用 7zip 在 powershell 中执行此操作。
我现在需要的是以某种方式将每个 zip 的文件数量限制为 15 个文件。
因此有一些限制,这需要采用 .zip 格式并且不能是跨区 zip,我的想法可能是让 powershell 一次运行 15 个,然后按顺序创建 zip,即首先将 15 个作为 test.zip 运行,然后将接下来的 15 个作为 test1.zip 运行,然后将接下来的 15 个作为 test2.zip 运行等等。
以下是我目前正在使用的代码。
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"
$filename="test"
sz a -tzip -mx5 -mmt=on $Target\"$filename.zip" $Source\$filename*.txt -r
答案1
这就是我想到的——我不保证或建议这是唯一/最好的方法。希望它能让你达到你想要的目标……:)
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"
$filename="test"
# Get the list of files to zip
$fileList = gci $Source\$filename*.txt
# Initalize a counter to keep track of which Zip we're working on.
$zipCounter = 1
# Loop through the file list, one at a time.
for ($i = 0; $i -lt $fileList.Length; $i++) {
# Use the current entry in the File List array to add the file to the zip.
sz a -tzip -mx5 -mmt=on "$target\$filename$zipCounter.zip" $fileList[$i] -r
# Use modulus - if it returns no remainder, then the current loop is a multiple of 15.
# (+1 and putting it last in the loop make it consider the zip name for the NEXT loop.
# I did this because "0 % 15 = 0").
if (($i + 1) % 15 -eq 0) {
# Multiple of 15? Time to switch to the next zip file.
$zipCounter++
}
}