首页 > 解决方案 > 外壳 | 删除文件夹并且是 Zip 存档中的内容

问题描述

我在网上搜索了一段时间,我几乎认为我有解决方案,但没有

我需要更新 Zip 文件中的内容,而无需每次都重新压缩整个 Zip 文件。我知道如何毫无问题地更新我的 Zip,我可以添加东西,但不能删除它们。具体来说,我可以删除一个文件,但不能删除一个包含文件的文件夹,我认为更新 Zip 中的文件夹会覆盖其所有内容,删除不再存在但不存在的内容,只会添加新内容。

这是我写的函数:

function RetraitElemZip
{
    param ([string]$Zip, [string]$Cible)

    if (Test-Path -Path $Zip -PathType Leaf)
    {
        $LecteurZip = [io.compression.zipfile]::Open($Zip,'Update')
        $Recherche = $LecteurZip.Entries | Where-Object { $_.fullname -match $Cible}

        if ($Recherche.Count -lt 1)
        { Write-Host("Impossible de retirer l'élément < $Cible > de < $Zip > !!") }
        else
        {
            foreach ($e in $Recherche)
            { $e.Delete() }
        }

        $LecteurZip.Dispose()
    }
    else
    { Write-Host("Le Fichier Zip < $Zip > n'est pas valide !!") }
}

但是搜索似乎没有找到任何匹配的条目,我已经使用有效地址运行了测试但没有成功。

因此,我的问题如下:我的代码中的错误在哪里?如何删除 Zip 文件中的文件夹及其所有内容?或者,如何更新 Zip 文件中的文件夹以删除不再存在的项目。

预先感谢您的回答。

标签: powershellzip

解决方案


我接近答案并最终找到了它......我只需要更详细地研究正则表达式。问题在于路径中的“\”,因为它们充当转义字符(我认为它是“`”)所以我不得不复制它们。

这是我更正的功能:

function RetraitElemZip
{
    param ([string]$Zip, [string]$Cible)

    if (Test-Path -Path $Zip -PathType Leaf)
    {
        # doubler les "\" dans le chemin car ce sont des caractères d'échapements
        $Temp = $Cible.Split("\")
        $Cible = $Temp[0]
        for ($i = 1; $i -lt $Temp.Count; ++$i)
        { $Cible += "\\{0}" -f $Temp[$i] }

        $LecteurZip = [io.compression.zipfile]::Open($Zip,'Update')
        $Recherche = $LecteurZip.Entries | Where-Object { $_.fullname -match $Cible}

        if ($Recherche.Count -lt 1)
        { Write-Host("Impossible de retirer l'élément < $Cible > de < $Zip > !!") }
        else
        {
            foreach ($e in $Recherche)
            { $e.Delete() }
        }

        $LecteurZip.Dispose()
    }
    else
    { Write-Host("Le Fichier Zip < $Zip > n'est pas valide !!") }
}

推荐阅读