我想查找名称为' 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
路径的正确方法是什么。
答案 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"
}