How to unzip a file in Powershell?

前端 未结 9 2111
清歌不尽
清歌不尽 2020-11-29 17:07

I have a .zip file and need to unpack its entire content using Powershell. I\'m doing this but it doesn\'t seem to work:

$shell = New-Object -Co         


        
相关标签:
9条回答
  • 2020-11-29 17:08

    Using expand-archive but auto-creating directories named after the archive:

    function unzip ($file) {
        $dirname = (Get-Item $file).Basename
        New-Item -Force -ItemType directory -Path $dirname
        expand-archive $file -OutputPath $dirname -ShowProgress
    }
    
    0 讨论(0)
  • 2020-11-29 17:09

    Hey Its working for me..

    $shell = New-Object -ComObject shell.application
    $zip = $shell.NameSpace("put ur zip file path here")
    foreach ($item in $zip.items()) {
      $shell.Namespace("destination where files need to unzip").CopyHere($item)
    }
    
    0 讨论(0)
  • 2020-11-29 17:09
    function unzip {
        param (
            [string]$archiveFilePath,
            [string]$destinationPath
        )
    
        if ($archiveFilePath -notlike '?:\*') {
            $archiveFilePath = [System.IO.Path]::Combine($PWD, $archiveFilePath)
        }
    
        if ($destinationPath -notlike '?:\*') {
            $destinationPath = [System.IO.Path]::Combine($PWD, $destinationPath)
        }
    
        Add-Type -AssemblyName System.IO.Compression
        Add-Type -AssemblyName System.IO.Compression.FileSystem
    
        $archiveFile = [System.IO.File]::Open($archiveFilePath, [System.IO.FileMode]::Open)
        $archive = [System.IO.Compression.ZipArchive]::new($archiveFile)
    
        if (Test-Path $destinationPath) {
            foreach ($item in $archive.Entries) {
                $destinationItemPath = [System.IO.Path]::Combine($destinationPath, $item.FullName)
    
                if ($destinationItemPath -like '*/') {
                    New-Item $destinationItemPath -Force -ItemType Directory > $null
                } else {
                    New-Item $destinationItemPath -Force -ItemType File > $null
    
                    [System.IO.Compression.ZipFileExtensions]::ExtractToFile($item, $destinationItemPath, $true)
                }
            }
        } else {
            [System.IO.Compression.ZipFileExtensions]::ExtractToDirectory($archive, $destinationPath)
        }
    }
    

    Using:

    unzip 'Applications\Site.zip' 'C:\inetpub\wwwroot\Site'
    
    0 讨论(0)
  • 2020-11-29 17:13

    In PowerShell v5+, there is an Expand-Archive command (as well as Compress-Archive) built in:

    Expand-Archive c:\a.zip -DestinationPath c:\a
    
    0 讨论(0)
  • 2020-11-29 17:16

    Here is a simple way using ExtractToDirectory from System.IO.Compression.ZipFile:

    Add-Type -AssemblyName System.IO.Compression.FileSystem
    function Unzip
    {
        param([string]$zipfile, [string]$outpath)
    
        [System.IO.Compression.ZipFile]::ExtractToDirectory($zipfile, $outpath)
    }
    
    Unzip "C:\a.zip" "C:\a"
    

    Note that if the target folder doesn't exist, ExtractToDirectory will create it. Other caveats:

    • Existing files will not be overwritten and instead trigger an IOException.
    • This method requires at least .NET Framework 4.5, available for Windows Vista and newer.
    • Relative paths are not resolved based on the current working directory, see Why don't .NET objects in PowerShell use the current directory?

    See also:

    • How to Compress and Extract files (Microsoft Docs)
    0 讨论(0)
  • 2020-11-29 17:19

    For those, who want to use Shell.Application.Namespace.Folder.CopyHere() and want to hide progress bars while copying, or use more options, the documentation is here:
    https://docs.microsoft.com/en-us/windows/desktop/shell/folder-copyhere

    To use powershell and hide progress bars and disable confirmations you can use code like this:

    # We should create folder before using it for shell operations as it is required
    New-Item -ItemType directory -Path "C:\destinationDir" -Force
    
    $shell = New-Object -ComObject Shell.Application
    $zip = $shell.Namespace("C:\archive.zip")
    $items = $zip.items()
    $shell.Namespace("C:\destinationDir").CopyHere($items, 1556)
    

    Limitations of use of Shell.Application on windows core versions:
    https://docs.microsoft.com/en-us/windows-server/administration/server-core/what-is-server-core

    On windows core versions, by default the Microsoft-Windows-Server-Shell-Package is not installed, so shell.applicaton will not work.

    note: Extracting archives this way will take a long time and can slow down windows gui

    0 讨论(0)
提交回复
热议问题