Powershell में किसी फ़ाइल को अनज़िप कैसे करें?


224

मेरे पास एक .zipफ़ाइल है और पॉवर्सशेल का उपयोग करके इसकी पूरी सामग्री को अनपैक करने की आवश्यकता है। मैं यह कर रहा हूँ, लेकिन यह काम नहीं करता है:

$shell = New-Object -ComObject shell.application
$zip = $shell.NameSpace("C:\a.zip")
MkDir("C:\a")
foreach ($item in $zip.items()) {
  $shell.Namespace("C:\a").CopyHere($item)
}

क्या गलत है? निर्देशिका C:\aअभी भी खाली है।


6
यदि आप Powershell 2.0 में हैं, या बिना .NET 4.5 स्थापित किए हैं, तो आपके द्वारा उल्लिखित विधि एकमात्र पथ है (बिना किसी 3-पार्टी exe (यानी 7zip) के साथ जाने के लिए। मैं कहूंगा कि प्रश्न का पूरी तरह से उत्तर नहीं दिया गया है। कोई यह क्यों काम नहीं करता है प्रदान करता है। यह मेरे लिए कुछ समय के लिए करता है, लेकिन दूसरों को यह नहीं है।
केनी

जवाबों:


248

यहाँ System.IO.Compression.ZipFile से ExtractToDirectory का उपयोग करने का एक सरल तरीका है :

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"

ध्यान दें कि यदि लक्ष्य फ़ोल्डर मौजूद नहीं है, तो ExtractToDirectory इसे बनाएगी। अन्य चेतावनी:

यह सभी देखें:


10
आप एकल फ़ंक्शन कॉल को बदलने के लिए फ़ंक्शन क्यों बनाते हैं?

17
सिद्धांत रूप में आप नहीं करते हैं। मैं फ़ंक्शंस में जटिल / अपरंपरागत कॉल को छिपाने की कोशिश करता हूं, इसलिए बाद में मैं इस बात की परवाह किए बिना विधि को बदल सकता हूं कि इसका उपयोग कहां किया जाता है। जैसा कि कीथ ने उल्लेख किया है, V5 में इसे करने का एक नया तरीका होगा।
मिकी बैलाडेल्ली

1
इसके लिए आपको कम से कम .NET फ्रेमवर्क 4.5 की आवश्यकता है। Msdn.microsoft.com/en-us/library/…
ferventcoder

10
मैंने यह कोशिश की, लेकिन नीचे त्रुटि हो रही है, Exception calling "ExtractToDirectory" with "2" argument(s): "End of Central Directory record could not be found." At line:5 char:5 + [System.IO.Compression.ZipFile]::ExtractToDirectory($zipfile, $ou ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : InvalidDataException
Karthi1234

4
यह मुझे निम्न त्रुटि देता है Add-Type : Cannot add type. The assembly 'System.IO.Compression.FileSystem' could not be found.:। मेरे पास .NET 4.6.2 स्थापित है, और मैंने सत्यापित किया है कि विधानसभा GAC में है, लेकिन मुझे यह पता नहीं चला कि मुझे यह त्रुटि क्यों मिल रही है।
सैम

500

PowerShell v5 + में, एक विस्तार-संग्रह कमांड (साथ ही कंप्रेस-आर्काइव) बनाया गया है:

Expand-Archive c:\a.zip -DestinationPath c:\a

26
$PSVersionTable.PSVersionयह निर्धारित करने के लिए उपयोग करें कि आप किस PowerShell का संस्करण चला रहे हैं।
ब्रैड सी

1
@ LoneCoder मुझे नहीं लगता कि आप बाल्मर को दोष दे सकते हैं। विंडोज में पहले कभी कंप्रेस्ड फाइल्स को हैंडल करने के लिए बिल्ट इन कमांड लाइन टूल नहीं था, भले ही 1992 में gzip निकला और टार और भी पुराना है।
jpmc26

2
@Ghashange PowerShell 5 विंडोज 10 और सर्वर 2012 के नीचे कुछ भी उपलब्ध नहीं था, जब यह उत्तर पोस्ट-रिलीज़ के पहले भी था।
jpmc26

11
ऐसा लगता है कि पैरामीटर OutputPathबदल दिया गया है DestinationPath(संदर्भ msdn.microsoft.com/powershell/reference/5.1/… )
एलिजा डब्लू। गगन

1
आप सापेक्ष रास्तों का भी उपयोग कर सकते हैं जैसेExpand-Archive -Path .\a.zip -DestinationPath .
Culip

24

PowerShell v5.1 में यह v5 की तुलना में थोड़ा अलग है। एमएस प्रलेखन के अनुसार, -Pathसंग्रह फ़ाइल पथ को निर्दिष्ट करने के लिए इसके पास एक पैरामीटर होना चाहिए।

Expand-Archive -Path Draft.Zip -DestinationPath C:\Reference

या फिर, यह एक वास्तविक मार्ग हो सकता है:

Expand-Archive -Path c:\Download\Draft.Zip -DestinationPath C:\Reference

विस्तार-पुरालेख डॉक्टर


3
इस Cmdlet में v5 और v5.1 के बीच कोई अंतर नहीं है। आपको पहले पैरामीटर को नाम देने की आवश्यकता नहीं है; यह स्वतः पथ बन जाएगा। उदाहरण के लिए, Expand-Archive Draft.Zip -DestinationPath C:\Referenceबिना किसी समस्या के काम करता है। इसके अलावा, यह वास्तविक पथ नहीं है, बल्कि पूर्ण पथ है।
फ्रैंकलिन यू

13

Expand-Archiveएक पैरामीटर सेट के साथ cmdlet का उपयोग करें :

Expand-Archive -LiteralPath C:\source\file.Zip -DestinationPath C:\destination
Expand-Archive -Path file.Zip -DestinationPath C:\destination

12

अरे इसके लिए मेरे काम ..

$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)
}

2
यदि फ़ाइलों या निर्देशिकाओं में से एक पहले से ही गंतव्य स्थान पर मौजूद है, तो यह संवाद को पॉप अप करने के लिए कहती है कि क्या करना है (अनदेखी, अधिलेखित) जो उद्देश्य को हरा देता है। क्या कोई जानता है कि इसे चुपचाप अधिलेखित करने के लिए कैसे मजबूर किया जाए?
ओलेग काजाकोव

@OlegKazakov द्वारा टिप्पणी का उत्तर देते हुए: CopyHereविधि को नियंत्रित करने वाले विकल्प का एक सेट है । मुझे लगता है कि @OlegKazakov ने पहले ही अपने मुद्दे को हल कर लिया है। फिर भी मैंने इस लिंक को अन्य सर्फ़र के
jsxt

4

उन लोगों के लिए, जो Shell.Application.Namespace.Folder.CopyHere () का उपयोग करना चाहते हैं और कॉपी करते समय प्रगति सलाखों को छिपाना चाहते हैं, या अधिक विकल्पों का उपयोग करना चाहते हैं, प्रलेखन यहां है:
https://docs.microsoft.com/en-us / विंडोज़ / डेस्कटॉप / खोल / फ़ोल्डर-copyhere

पॉवरशेल का उपयोग करने और प्रगति पट्टियों को छिपाने और पुष्टिकरणों को अक्षम करने के लिए आप इस तरह कोड का उपयोग कर सकते हैं:

# 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)

विंडोज़ के मुख्य संस्करणों पर Shell.Application के उपयोग की सीमाएं:
https://docs.microsoft.com/en-us/windows-server/administration/server-core/what-is-server-core

विंडोज़ कोर संस्करणों पर, डिफ़ॉल्ट रूप से Microsoft-Windows-Server-Shell-Package स्थापित नहीं किया गया है, इसलिए shell.applicaton काम नहीं करेगा।

नोट : इस तरह से अभिलेखागार निकालने में लंबा समय लगेगा और विंडोज़ गुई को धीमा कर सकता है


3

expand-archiveसंग्रह के नाम पर स्वतः-निर्मित निर्देशिकाओं का उपयोग करना :

function unzip ($file) {
    $dirname = (Get-Item $file).Basename
    New-Item -Force -ItemType directory -Path $dirname
    expand-archive $file -OutputPath $dirname -ShowProgress
}

यह जरूरी वर्तमान निर्देशिका में फैलता है, है ना?
jpmc26

वास्तव में ऑटो बनाने के अतिरिक्त मूल्य को न देखें। outputPathस्वीकृत उत्तर में दूसरे पैरामीटर को जोड़ना अधिक लचीला है । इस समाधान में (जैसा कि jpmc26 ने कहा), आप हमेशा वर्तमान निर्देशिका में एक नई निर्देशिका बनाएंगे, इसलिए यह संभव है कि आपको कॉल करने से पहले वर्तमान निर्देशिका को सेट करने की आवश्यकता होunzip
Rubanov

अधिकांश अभिलेखागार अभिलेखागार के नाम पर एक डायर में संग्रह के रूप में उसी स्थान पर निकालते हैं। यदि आप कुछ अलग करना चाहते हैं तो आपको मापदंडों को जोड़ने से रोकने के लिए कुछ भी नहीं है, लेकिन यह एक समझदार डिफ़ॉल्ट है।
मिकमेकाना

1
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)
    }
}

का उपयोग करते हुए:

unzip 'Applications\Site.zip' 'C:\inetpub\wwwroot\Site'

निपटाने के लिए मत भूलना $archiveऔर $archiveFileअंत में
tom.maruska

0

ForEachलूप $filepathचर के भीतर स्थित प्रत्येक ज़िप फ़ाइल को संसाधित करता है

    foreach($file in $filepath)
    {
        $zip = $shell.NameSpace($file.FullName)
        foreach($item in $zip.items())
        {
            $shell.Namespace($file.DirectoryName).copyhere($item)
        }
        Remove-Item $file.FullName
    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.