从Compress-Archive Powershell Cmd

时间:2019-01-21 23:58:14

标签: powershell

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

2 个答案:

答案 0 :(得分: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"

让我知道您是否希望我进一步完善它。我觉得有一种更简单的方法。

答案 1 :(得分:0)

$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