ExtractToDirectory выдает ошибку «Извлечение Zip-записи приведет к тому, что файл окажется за пределами указанного каталога назначения» - PullRequest
0 голосов
/ 14 мая 2019

Я работаю над сценарием для извлечения всех zip-файлов из папки загрузок в каталог на рабочем столе. У меня все работает нормально для моих целей, но есть один файл .zip, который я пробовал, который вызывает у меня проблемы.

При попытке извлечь ExtractToDirectory он возвращает 2 аргумента и что «Извлечение в Zip-запись приведет к созданию файла вне указанного конечного каталога». Я могу использовать WinZip, а также Извлечь все в проводнике файлов, чтобы распаковать его. этот .zip правильно. Я в недоумении, в чем может быть проблема.

#Script to Unzip .zip files in downloads folder.

#$src = file you're unzipping, $dest = destination for contents

$src = 'C:\Users\' + $env:USERNAME + '\Downloads\'
$dest = 'C:\Users\' + $env:USERNAME + '\Desktop\Zips\'

Function UnZipper($src, $dest)
{
    Add-Type -AssemblyName System.IO.Compression.FileSystem
    #specifies zip files in directory
    $zps = Get-ChildItem $src -Filter *.zip

    #unpacks each zip in directory to destination folder
    foreach ($zp IN $zps)
    {
        #Sets File Path of original zip
        $Zips = ($src + $zp)
        #Sets destination of zip. Creates folder if it does not exist.
        $NewFolder = $dest + $zp
        $NewFolder = $NewFolder.TrimEnd(".zip")
        #Checks if file already exists (has been unzipped)
        $FileExists = Test-Path $NewFolder
        If ($FileExists -eq $false)
        {
        Write-Host 'UnZipping -'$zp
        [System.IO.Compression.ZipFile]::ExtractToDirectory($Zips, $NewFolder)
        }
    }
}

UnZipper -src $src -dest $dest
Write-Host "Your files have been Un-Zipped!"
Write-Host "Press the enter key to exit and open your file(s)" -ForegroundColor Green
Read-Host
explorer $dest

В конечном счете, если это проблема с конкретным почтовым индексом, который не может быть исправлен, это нормально для меня. Я просто пытаюсь понять, почему он работает с WinZip, но не с PowerShell.

1 Ответ

0 голосов
/ 14 мая 2019

$zps = Get-ChildItem $src -Filter *.zip -File создает массив объектов FileInfo , и вы не должны рассматривать их как простые строки пути к файлу, как в цикле foreach.

Лучше использовать командлет Join-Path для построения путей, где это необходимо:

Под переписью вашей функции

function UnZipper {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $true, Position = 0)]
        [string]$src,

        [Parameter(Mandatory = $true, Position = 1)]
        [string]$dest
    )
    Add-Type -AssemblyName System.IO.Compression.FileSystem

    # get an array of FileInfo objects for zip files in the $src directory and loop through
    Get-ChildItem $src -Filter *.zip -File | ForEach-Object {
        # unpacks each zip in directory to destination folder
        # the automatic variable '$_' here represents a single FileInfo object, each file at a time

        # Get the destination folder for the zip file. Create the folder if it does not exist.
        $destination = Join-Path -Path $dest -ChildPath $_.BaseName  # $_.BaseName does not include the extension

        # Check if the folder already exists
        if (!(Test-Path $destination -PathType Container)) {
            # create the destination folder
            New-Item -Path $destination -ItemType Directory -Force | Out-Null

            # unzip the file
            Write-Host "UnZipping - $($_.FullName)"
            [System.IO.Compression.ZipFile]::ExtractToDirectory($_.FullName, $destination)
        }
        else {
            Write-Host "Folder '$destination' already exists. File skipped."
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...