将 Shapefile 压缩为单独的 zip 文件,并报告 Shapefile 的文件名前缀

将 Shapefile 压缩为单独的 zip 文件,并报告 Shapefile 的文件名前缀

我有数百个 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
}

相关内容