从Powershell 4中的zip文件中删除文件

时间:2018-10-05 00:03:39

标签: powershell

我有一个运行良好的功能。它将zip文件解压缩到目标文件夹中。如果目标文件夹中包含文件,它将被新的提取文件覆盖。现在,我想在提取zip文件之前删除/删除一个大小为12G的文件(bigfile.txt)。我该怎么做。有人可以帮我吗?下面是功能。谢谢

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 :(得分:0)

您仅显示从zip文件中获取的解压缩/解压缩,而不是删除您需要的内容。

您所要的东西似乎与本讨论和答案重复

Remove files from .zip file with Powershell

您还已经在调用System.IO.Compression命名空间,因此System.IO.Compression.Filesystem具有更新和删除方法。

示例:(忽略/删除暂停-它就在那儿,以便每个阶段都可以看到结果。)

# 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或从某些文本文件中,使用相同的cmdlet搜索它们。

两种方法都相同。

如果我直接检查您的功能,请在此过程中修复一些问题。 试试这个...

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中发生的情况的一种方式。

您现在要做的就是在提供的空白处添加其他代码。