2014-12-11 5 views
1

Я пытаюсь удалить папки, которые старше определенной даты. Эти папки в почтовый файл, который выложен так:Удалить папки старше X в zip-файле

<Zip Folder> <Folder 1> <Folder 2> <Folder 3> <Folder 4>

Папки 2, 3 и 4 не может понадобиться все удаленные, так что я не могу просто удалить основной почтовый файл. Я попробовал это, но это dosen't, кажется, сделать что-нибудь:

function DeleteAuditFiles{ 
# The two parameters. 
param([string]$limit, [string]$path) 

$zips = Get-ChildItem -Path $path -recurse *.zip 

foreach ($zipfile in $zips) { 

    $stream = New-Object IO.FileStream($zipfile.FullName, [IO.FileMode]::Open) 
    $mode = [IO.Compression.ZipArchiveMode]::Update 
    $zip = New-Object IO.Compression.ZipArchive($stream, $mode) 

    ($zip.Entries | ? { $_.PSIsContainer -and $_.CreationTime -lt $limit }) | % { $_.Delete() } 

    $zip.Dispose() 
    $stream.Close() 
} 
} 
+0

Вы пытались использовать 'Remove-Item $ _. FullName -Force -Recurse' вместо' $ _. Delete() ' – Richard

+0

@Chard Я пробовал это и, похоже, не работает, я Я не уверен, правильно ли мой код в определении каждой папки. Спасибо за вашу помощь –

+0

Получите его, чтобы распечатать все пути к файлу с помощью 'Write-Host $ _. FullName' – Richard

ответ

3

мне пришлось добавить тип использовать IO.Compression.ZipArchive:

Add-Type -AssemblyName System.IO.Compression 

Смотрите, если это работает:

 $toDelete = $zip.Entries | where{ $_.name -eq "" -and $_.LastWriteTime -lt $limit } 
     $toDelete | % { $_.Delete() } 

Я использовал переменную, потому что сначала нужно удалить все папки, которые вы хотите удалить, в списке, если вы удалите их при перечислении, Powershell будет жаловаться на исключение:

An error occurred while enumerating through a collection: Collection was modified; enumeration operation may not execute.. 
+0

Осторожно с '$ _. PSIsContainer -and $ _. CreationTime -lt $ limit' where clause. Я думаю, что OP будет использовать скобки, чтобы получить желаемый результат. '$ _. PSIsContainer -and ($ _. CreationTime -lt $ limit)'. FYI – Matt

+1

Да, я заметил, что в папках было пустое имя, а значит, '$ _. Name -eq" ". Кроме того, OP необходимо будет удалить файлы в каждой папке, так как эти записи не будут удалены путем удаления родительской папки. –

Смежные вопросы