我有数百个 Shapefile 结构化文件,我想将它们压缩成单独的 zip 文件。更准确地说,我有一个包含以下文件的文件夹(我仅列出其中一些作为示例):
- 网格_5_N0E0.dbf
- 网格_5_N0E0.prj
- 网格_5_N0E0.shp
- 网格_5_N0E0.shx
- 网格_5_N0E90.dbf
- 网格_5_N0E90.prj
- 网格_5_N0E90.shp
- 网格_5_N0E90.shx
我的目标是自动生成包含每个数据集的 4 个文件的 zip 文件,并具有与数据集匹配的 zip 文件名,如下所示:
- 网格_5_N0E0.zip
- 网格_5_N0E90.zip
到目前为止,我发现此解决方案通过在 Windows PowerShell 中运行此脚本,我可以自动为每个“x”文件创建 zip 文件:
param
(
# The input folder containing the files to zip
[Parameter(Mandatory = $true)]
[string] $InputFolder,
# The output folder that will contain the zip files
[Parameter(Mandatory = $true)]
[string] $OutputFolder
)
Set-Variable SET_SIZE -option Constant -value 4
$i = 0
$zipSet = 0
Get-ChildItem $InputFolder | ForEach-Object {
$zipSetName = "archive" + ($zipSet + 1) + ".zip"
Compress-Archive -Path $_.FullName -Update -DestinationPath "$OutputFolder\$zipSetName"
$i++;
if ($i -eq $SET_SIZE) {
$i = 0;
$zipSet++;
}
}
通过将 SET_SIZE 值设置为 4,我能够自动执行此过程,但结果是
- 存档1.zip
- 存档2.zip
- ETC。
现在我要找到一种方法来告诉脚本为每个 zip 文件分配它包含的文件的名称(除了扩展名之外,其他名称都相同),以便返回带有这些前缀的 zip 文件,正如已经解释的那样:
- 网格_5_N0E0.zip
- 网格_5_N0E90.zip
- ETC。
是否可以通过使用适当的参数执行该脚本来实现这一点?
答案1
只需Group-Object
根据 BaseName 对文件进行分组即可。使用相同的 BaseName 作为 zip 文件的名称:
param (
# The input folder containing the files to zip
[Parameter(Mandatory = $true)]
[string] $InputFolder,
# The output folder that will contain the zip files
[Parameter(Mandatory = $true)]
[string] $OutputFolder
)
# make sure the destination folder for the zip files exists
$null = New-Item -Path $OutputFolder -ItemType Directory -Force
Get-ChildItem -Path $InputFolder -File |
Where-Object { $_.Extension -match '\.(dbf|prj|shp|shx)' } | # filter the files on allowed extensions
Group-Object BaseName | ForEach-Object { # group on the BaseName like 'Grid_5_N0E0'
$zip = Join-Path -Path $OutputFolder -ChildPath $_.Name # create the full path and filename for the zip file
Compress-Archive -Path $_.Group.FullName -DestinationPath $zip # compress the files in the group
}