代码之家  ›  专栏  ›  技术社区  ›  Iofacture

从压缩存档PowerShell命令中排除子目录

  •  0
  • Iofacture  · 技术社区  · 5 年前

    如果这个问题看起来很奇怪,我会提前道歉,这是我第一次尝试使用PowerShell处理类似的问题。

    我有一个类似以下的目录结构:

    DIR1/
        bin/
        obj/
        d1-file1
        d1-file2 
    DIR2/
        bin/
        obj/
        d2-file1
        d2-file2
    DIR3/
        bin/
        obj/
        d3-file1
        d3-file2
    

    我正试图用一组顶级和子级排除来压缩这个目录列表。例如,我想排除一个特定的顶级目录(如dir2),同时从最终结果集中排除特定的子目录(如bin、obj)。

    我尝试了几种不同的方法,但不幸的是,当我遍历子目录时,compress archive命令将压缩子级别的项目,而不保留顶级目录结构。我希望在存档中保留顶级目录结构,同时也排除指定的子目录。

    $entries = New-Object System.Collections.Generic.List[System.Object] 
    
    # Get initial directory listing
    $dirlist = Get-ChildItem $solutionFileLocation -ad -Exclude "DIR2" | ForEach-Object { $_.FullName }
    
    # Exclude bin and obj directories and add entry path to our zip entry list
    foreach ($dir in $dirlist)
    {
        $sub = Get-ChildItem $dir -Exclude "bin", "obj" | ForEach-Object { $_.FullName }
    
        foreach ($itm in $sub)
        {
            $entries.Add($itm)
        }
    }
    
    Compress-Archive -LiteralPath $entries -CompressionLevel Optimal -DestinationPath "C:\Filename01212019.zip"
    

    结果是一个包含以下内容的存档:

    d1-file1
    d1-file2
    d3-file1
    d3-file2
    

    而不是期望的结果:

    DIR1/
        d1-file1
        d1-file2 
    DIR3/
        d3-file1
        d3-file2
    
    1 回复  |  直到 5 年前
        1
  •  1
  •   Robert Cotterman    5 年前

    这里有一个可能的选择(我的评论是什么意思)

    $entries = New-Object System.Collections.Generic.List[System.Object] 
    
    $exclude = "DIR2,DIR6"
    
    # Get initial directory listing
    $dirlist = Get-ChildItem $solutionFileLocation -ad -Exclude "$exclude" | ForEach-Object { $_.FullName }
    
    # Exclude bin and obj directories and add entry path to our zip entry list
    foreach ($dir in $dirlist)
    {
        $sub = Get-ChildItem $dir -Exclude "bin", "obj" | ForEach-Object { $_.FullName }
    
        $entries.Add("$($dir.split('/')[-1])/")
        foreach ($itm in $sub)
        {
            $entries.Add($itm)
        }
    }
    
    Compress-Archive -LiteralPath $entries -CompressionLevel Optimal -DestinationPath "C:\Filename01212019.zip"
    

    如果你想让我进一步完善它,请告诉我。我觉得有一个更简单的方法。