Удалить файл из zip-файлов в powershell 4 - PullRequest
0 голосов
/ 05 октября 2018

У меня есть функция, которая работает нормально.Извлекает zip-файл в папку назначения.Если папка назначения содержит файлы, она перезаписывается новыми файлами извлечения. Теперь я хотел удалить / удалить один файл (bigfile.txt) размером 12 ГБ перед извлечением zip-файла.Как я это сделаюКто-нибудь может мне помочь ?ниже функция.Спасибо

function Unzip($zipfile, $outdir)
{
Add-Type -AssemblyName System.IO.Compression.FileSystem
$archive = [System.IO.Compression.ZipFile]::OpenRead($zipfile)
foreach ($entry in $archive.Entries)
{
$entryTargetFilePath = [System.IO.Path]::Combine($outdir, $entry.FullName)
$entryDir = [System.IO.Path]::GetDirectoryName($entryTargetFilePath)
#Ensure the directory of the archive entry exists
if(!(Test-Path $entryDir )){
New-Item -ItemType Directory -Path $entryDir | Out-Null
}

#If the entry is not a directory entry, then extract entry
if(!$entryTargetFilePath.EndsWith("\")){
[System.IO.Compression.ZipFileExtensions]::ExtractToFile($entry, $entryTargetFilePath, $true);
}

Unzip -zipfile "c:\temp\filezip_1.zip" -outdir "c:\folder_1\extracted_files"
Unzip -zipfile "c:\temp\filezip_2.zip" -outdir "c:\folder_2\extracted_files"e

1 Ответ

0 голосов
/ 05 октября 2018

Вы показываете только ваши усилия по распаковке / извлечению из файла 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 до и после удаления или указанного файла.

Все, что вам нужно сделать сейчас, это добавить другой код в соответствующее место.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...