Вы показываете только ваши усилия по распаковке / извлечению из файла zip, а не вы удаляете усилия, о которых вы просите.
Тем не менее, то, что вы просите, похоже, является дубликатом этого обсуждения и ответа.
Удалить файлы из .zipфайл с Powershell
Вы также уже вызываете пространство имен System.IO.Compression, поэтому System.IO.Compression.Filesystem имеет метод update и delete.
Пример: (игнорировать / удалить паузу - она просто есть, поэтому можно увидеть результат на каждом этапе.)
# Zip file path
$zip = 'D:\Temp\MyFile.zip'
# Instantiate the .Net namespace
add-type -AssemblyName 'System.IO.Compression.filesystem'
# Remove a file from a zip archive
foreach ($z in $zip)
{
# Open the zip for updating
$tempz = [io.compression.zipfile]::Open($z,'Update')
"`nShow all files in the zip"
$tempz.Entries
Pause
"`nDelete a specific file"
($tempz.Entries | Where FullName -Match 'Test.clixml').Delete()
Pause
"`nValidate remove"
$tempz.Entries
Pause
# Clean up / close the zip
$tempz.Dispose()
}
Show all files in the zip
Archive : System.IO.Compression.ZipArchive
CompressedLength : 69
ExternalAttributes : 32
FullName : newfile.txt
LastWriteTime : 30-Sep-18 20:52:08 -07:00
Length : 116
Name : newfile.txt
Archive : System.IO.Compression.ZipArchive
CompressedLength : 41438
ExternalAttributes : 32
FullName : ps-gps.xml
LastWriteTime : 02-Oct-18 19:29:44 -07:00
Length : 767464
Name : ps-gps.xml
Archive : System.IO.Compression.ZipArchive
CompressedLength : 45
ExternalAttributes : 32
FullName : MyFile.txt
LastWriteTime : 30-Sep-18 23:31:08 -07:00
Length : 55
Name : MyFile.txt
Archive : System.IO.Compression.ZipArchive
CompressedLength : 132
ExternalAttributes : 32
FullName : Test.clixml
LastWriteTime : 02-Oct-18 17:26:00 -07:00
Length : 202
Name : Test.clixml
Press Enter to continue...:
Delete a specific file
Press Enter to continue...:
Validate remove
Archive : System.IO.Compression.ZipArchive
CompressedLength : 69
ExternalAttributes : 32
FullName : newfile.txt
LastWriteTime : 30-Sep-18 20:52:08 -07:00
Length : 116
Name : newfile.txt
Archive : System.IO.Compression.ZipArchive
CompressedLength : 41438
ExternalAttributes : 32
FullName : ps-gps.xml
LastWriteTime : 02-Oct-18 19:29:44 -07:00
Length : 767464
Name : ps-gps.xml
Archive : System.IO.Compression.ZipArchive
CompressedLength : 45
ExternalAttributes : 32
FullName : MyFile.txt
LastWriteTime : 30-Sep-18 23:31:08 -07:00
Length : 55
Name : MyFile.txt
Press Enter to continue...:
Обновление согласно запросу OP/ несколько файлов и слияние кодов
Количество zip-файлов, с которыми вам, возможно, придется иметь дело, на самом деле не имеет значения.Передайте столько, сколько у вас есть.
То, что вы не сказали, как вы получаете эти имена файлов zip.Значение через Get-ChildItem или из какого-либо текстового файла, поиск их с использованием одного и того же командлета.
В любом случае процесс одинаков.
Если я лечу вашу функцию напрямую, исправляя некоторыевещи по пути.Попробуйте это ...
function Expand-ZipFilesWithCleanUp
{
[cmdletbinding()]
[Alias('ezc')]
Param
(
[string[]]$ZipFiles,
[string]$Outdir,
[string] $FilenameToRemove
)
# Instantiate the .Net namespace
add-type -AssemblyName 'System.IO.Compression.filesystem'
"The number of zip files passed in was $($ZipFiles.Count)"
# Remove unwanted files
foreach ($ZipFile in $ZipFiles)
{
# Open the zip for updating
$ProcessZipFile = [io.compression.zipfile]::Open($ZipFile,'Update')
"`nShow all files in the zip"
$ProcessZipFile.Entries | Out-GridView -PassThru
"`nDeleting unwanted file $FilenameToRemove from $ZipFile"
($ProcessZipFile.Entries | Where FullName -Match $FilenameToRemove).Delete()
"`nValidate remove"
$ProcessZipFile.Entries | Out-GridView -PassThru
# Clean up / close the zip
$ProcessZipFile.Dispose()
}
#//Begin unzip code
#//End unzip code
}
Expand-ZipFilesWithCleanUp -ZipFiles (Get-ChildItem -Path 'D:\Temp' -Filter '*.zip').FullName -FilenameToRemove 'Test.clixml'
Опять же, эти ..
$ProcessZipFile.Entries | Out-GridView -PassThru
... строки не нужны, они просто способ открыть диалоговое окно, чтобы показать вам, что происходит вzip до и после удаления или указанного файла.
Все, что вам нужно сделать сейчас, это добавить другой код в соответствующее место.