【问题标题】:Exclude sub-directories from Compress-Archive Powershell Cmd从 Compress-Archive Powershell Cmd 中排除子目录
【发布时间】:2020-03-07 00:09:17
【问题描述】:

如果这个问题看起来很奇怪,我提前道歉,这是我第一次尝试使用 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

【问题讨论】:

  • 据我所知,如果你指定一个文件,你只会得到文件——根本没有路径信息。但是,如果您指定一个目录……您将获得带有路径的文件。我怀疑您将需要创建一个仅包含您想要的内容的目录树并对其进行压缩。
  • 当您将条目添加到 $entries 数组时,为什么不先添加 $dir
  • @lofacture 您可以在另一个线程中找到可能的解决方案:stackoverflow.com/a/59018865/2349693

标签: powershell


【解决方案1】:

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

$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"

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

【讨论】:

  • 最终我无法让这些解决方案中的任何一个工作 - 但你是对的 - 有一个更简单的方法。这种方法是调用 MSBUILD 并在解决方案上调用“clean”,从而至少清空可执行文件和 dll 的 bin 文件夹。然后我可以只打包顶级目录,而不必担心“bin”和“obj”中有什么
  • 很遗憾听到这个消息。我很高兴你发现了一些东西。
【解决方案2】:
$exclude = $settings.appFolderName

$folders = get-ChildItem -Path $settings.sourceFolderPath | Where-Object {$_.name -notlike $exclude} | Select-Object FullName

$zipFold = @();
foreach( $item in $folders){    
    $zipFold +=$item.FullName
}

Compress-Archive -Path $zipFold -DestinationPath $zipDir -CompressionLevel Fastest

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-23
    相关资源
    最近更新 更多