找到所有特定文件夹并压缩它们

时间:2017-05-16 15:10:00

标签: powershell powershell-v5.0

我想查找名称为' test'的所有文件夹。然后将它们压缩成具有不同名称的单个文件夹。

我设法做了一些代码:

$RootFolder = "E:\"
$var = Get-ChildItem -Path $RootFolder -Recurse |
       where {$_.PSIsContainer -and $_.Name -match 'test'}

#this is assembly for zip functionality
Add-Type -Assembly "System.IO.Compression.Filesystem"

foreach ($dir in $var) {
    $destination = "E:\zip\test" + $dir.Name + ".zip"

    if (Test-Path $destination) {Remove-Item $destination}

    [IO.Compression.Zipfile]::CreateFromDirectory($dir.PSPath, $destination)
}

它给了我一个错误:

  

异常调用" CreateFromDirectory"用" 2"参数:"不支持给定路径的格式。"

我想知道,传递$dir路径的正确方法是什么。

3 个答案:

答案 0 :(得分:1)

如果您正在使用v5,我建议您使用Commandlet

如果您不想使用命令行开关,可以使用:

$FullName = "Path\FileName"
$Name = CompressedFileName
$ZipFile = "Path\ZipFileName"
$Zip = [System.IO.Compression.ZipFile]::Open($ZipFile,'Update')
[System.IO.Compression.ZipFileExtensions]::CreateEntryFromFile($Zip,$FullName,$Name,"optimal")
$Zip.Dispose()

答案 1 :(得分:1)

PSPath返回的Get-ChildItem属性以PSProvider为前缀。 CreateFromDirectory() method需要两个字符串;第一个是sourceDirectoryName,您可以从对象中使用Fullname

$RootFolder = "E:\"
$Directories = Get-ChildItem -Path $RootFolder -Recurse | Where-Object {
    $_.PSIsContainer -And
    $_.BaseName -Match 'test'
}

Add-Type -AssemblyName "System.IO.Compression.FileSystem"

foreach ($Directory in $Directories) {
    $Destination = "E:\zip\test$($Directory.name).zip"

    If (Test-path $Destination) {
        Remove-Item $Destination
    }

    [IO.Compression.ZipFile]::CreateFromDirectory($Directory.Fullname, $Destination) 
}

答案 2 :(得分:0)

如果你有这样的文件夹结构:

- Folder1
 -- Test
- Folder2
 -- Test
- Folder3
 -- Test

你可以这样做:

gci -Directory -Recurse -Filter 'test*' | % {
    Compress-Archive "$($_.FullName)\**" "$($_.FullName -replace '\\|:', '.' ).zip"
}

你会得到:

D..Dropbox.Projects.StackOverflow-Posh.ZipFolders.Folder1.Test.zip D..Dropbox.Projects.StackOverflow-Posh.ZipFolders.Folder2.Test.zip D..Dropbox.Projects.StackOverflow-Posh.ZipFolders.Folder3.Test.zip

或者如果你想保留拉链内的目录结构:

gci -Directory -Recurse -Filter 'test*' | % {
        Compress-Archive $_.FullName "$($_.FullName -replace '\\|:', '.' ).zip"
    }