পাওয়ারশেলে কোনও ফাইল আনজিপ করবেন কীভাবে?


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
আপনি যদি পাওয়ারশেল ২.০ এ থাকেন বা নেট নেট 4.5.৪ ইনস্টল না করে থাকেন তবে আপনি যে পদ্ধতিটি উল্লেখ করেছেন তা হ'ল একমাত্র পথ (তৃতীয় পক্ষের এক্সে (অর্থাত্ z জীপ) না নিয়েই। কেউ কেন এই পদ্ধতি কাজ করে না প্রদান করে এটা আমাকে কিছু সময় জন্য না, কিন্তু অন্যদের এটি
কেনি

উত্তর:


248

এখানে ব্যবহার করে একটি সহজ উপায় ExtractToDirectory থেকে 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"

লক্ষ্য করুন যে যদি লক্ষ্য ফোল্ডারটি বিদ্যমান না থাকে তবে এক্সট্রাক্টটো ডিরেক্টরী এটি তৈরি করবে। অন্যান্য সতর্কতা:

আরো দেখুন:


10
আপনি কেন একটি একক ফাংশন কল প্রতিস্থাপন করতে একটি ফাংশন তৈরি করবেন?

17
তত্ত্ব আপনি না। আমি ফাংশনগুলিতে জটিল / অপ্রচলিত কলগুলি আড়াল করার চেষ্টা করি তাই পরে আমি কোথায় এটি ব্যবহার করব তা চিন্তা না করে পদ্ধতিটি প্রতিস্থাপন করতে পারি। কীথ যেমন উল্লেখ করেছে, ভি 5 তে এটি করার একটি নতুন উপায় থাকবে।
মিকি বল্লাদেলি

1
এর জন্য আপনার কমপক্ষে। নেট ফ্রেমওয়ার্ক 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
পেয়েছি

4
এটি আমার নিম্নলিখিত ত্রুটির দেয়: Add-Type : Cannot add type. The assembly 'System.IO.Compression.FileSystem' could not be found.। আমি .NET 4.6.2 ইনস্টল করেছি এবং আমি যাচাই করেছি যে সমাবেশটি জিএসি-তে রয়েছে তবে আমি কেন এই ত্রুটিটি পাচ্ছি তা বুঝতে পারি নি।
স্যাম

500

পাওয়ারশেল ভি 5 + তে একটি বিস্তৃত-সংরক্ষণাগার কমান্ড (পাশাপাশি সংক্ষেপিত-সংরক্ষণাগার) রয়েছে:

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

26
$PSVersionTable.PSVersionআপনি কী চালাচ্ছেন পাওয়ার শেলের কোন সংস্করণ তা নির্ধারণ করতে ব্যবহার করুন ।
ব্র্যাড সি

1
@ লোনকোডার আমি মনে করি না আপনি বলমারকে দোষ দিতে পারেন। 1992 সালে gzip প্রকাশিত হয়েছিল এবং তার চেয়েও বেশি বয়স্ক হওয়া সত্ত্বেও, উইন্ডোজ এর আগে কখনও সংক্ষেপিত ফাইলগুলি পরিচালনা করার জন্য বিল্ট ইন কমান্ড লাইন সরঞ্জামটি ছিল না
jpmc26

2
উইন্ডোজ 10 এবং সার্ভার ২০১২-এর নীচে যে কোনও উত্তর রিলিজ হিসাবে প্রকাশিত হওয়ার পরে @ ঘাশেজে পাওয়ারশেল 5 এমনকি কোনও কিছুর জন্য উপলব্ধ ছিল না।
jpmc26

11
দেখে মনে হচ্ছে প্যারামিটারটি OutputPathপরিবর্তিত হয়েছে DestinationPath(রেফারেন্স এমএসডিএন.ইমক্রোসফট. / পাওয়ারসেল / রেফারেন্স / ৫.১/২ )
ডাব্লু। গাগন

1
আপনি আপেক্ষিক Expand-Archive -Path .\a.zip -DestinationPath .
পাথগুলিও

24

পাওয়ারশেল v5.1 এ এটি ভি 5 এর তুলনায় কিছুটা আলাদা। এমএস ডকুমেন্টেশন অনুসারে -Pathসংরক্ষণাগার ফাইলের পাথ নির্দিষ্ট করার জন্য এটির একটি প্যারামিটার থাকতে হবে।

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

অন্যথায়, এটি একটি আসল পথ হতে পারে:

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

প্রসারিত-সংরক্ষণাগার ডক


3
এই সিএমডলেটে ভি 5 এবং ভি 5.1 এর মধ্যে কোনও পার্থক্য নেই। আপনাকে প্রথম প্যারামিটারটির নাম দেওয়ার দরকার নেই; এটি স্বয়ংক্রিয়ভাবে পথে পরিণত হবে। উদাহরণস্বরূপ, Expand-Archive Draft.Zip -DestinationPath C:\Referenceইস্যু ছাড়াই কাজ করে। তদতিরিক্ত, এটি আসল পথ নয়, পরম পথ।
ফ্রাঙ্কলিন ইউ

13

Expand-Archiveএকটি প্যারামিটার সেট সহ সেমিডলেট ব্যবহার করুন :

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
গন্তব্যস্থলে যদি ফাইল বা ডিরেক্টরিগুলির মধ্যে একটি ইতিমধ্যে উপস্থিত থাকে তবে এটি কী করতে হবে (উপেক্ষা, ওভাররাইট) যা উদ্দেশ্যকে হারাবে তা জিজ্ঞাসা করে একটি কথোপকথন পপ আপ করে। কেউ কি চুপচাপ ওভাররাইট করতে বাধ্য করে তা কী জানেন?
ওলেগ কাজাকভ

@ ওলেগকাজাকভের মন্তব্যের জবাব: CopyHereপদ্ধতিটি নিয়ন্ত্রণের বিকল্প রয়েছে of আমার ধারণা, ইতিমধ্যে @ ওলেজকাজাকভ তার সমস্যা সমাধান করেছেন। তবুও আমি এই লিঙ্কটি এমন অন্যান্য সার্ফারদের জন্য এখানে রেখেছি যারা এই বিষয়টি সন্ধান করতে পারে: ডকস.মাইক্রোসফট.ইন- ইউস
প্রিফিসিয়াল

4

যারা শেল.অ্যাপ্লিকেশন.নামস্পেস.ফোল্ডার.কপি হিয়ার () ব্যবহার করতে চান এবং অনুলিপি করার সময় অগ্রগতি বারগুলি গোপন করতে চান বা আরও বিকল্প ব্যবহার করতে চান, তাদের জন্য ডকুমেন্টেশনটি এখানে রয়েছে:
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)

উইন্ডোজের মূল সংস্করণগুলিতে শেল ব্যবহারের সীমাবদ্ধতা: https://docs.microsoft.com/en-us/windows-server/administration/server-core/ কি-is-server-core

উইন্ডোজ মূল সংস্করণগুলিতে, ডিফল্টরূপে মাইক্রোসফ্ট-উইন্ডোজ-সার্ভার-শেল-প্যাকেজ ইনস্টল করা হয় না, সুতরাং শেল। অ্যাপ্লিকেশন কাজ করবে না।

দ্রষ্টব্য : এইভাবে সংরক্ষণাগারগুলি উত্তোলন করতে অনেক সময় সময় লাগবে এবং উইন্ডো গিও কমিয়ে আনতে পারে


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
রুবানোভ

বেশিরভাগ আর্কাইভ সংরক্ষণাগার হিসাবে একই জায়গায় সংরক্ষণাগারটির নামানুসারে একটি ডিরের সাথে বের করে। আপনি অন্যরকম কিছু চাইলে প্যারামিটার যুক্ত করা থামানোর কিছুই নয়, তবে এটি বোধগম্য ডিফল্ট।
মাইকমেকানা

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
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.