PowerShell आर्काइव मॉड्यूल का परिचय
आप ZIP आर्काइव बनाने और उन्हें निकालने के लिए PowerShell की सुविधाओं का उपयोग कर सकते हैं। PowerShell 5.0 (यह PowerShell संस्करण डिफ़ॉल्ट रूप से Windows 10 पर इंस्टॉल है) में, एक अलग मॉड्यूल Microsoft.PowerShell.Archive उपलब्ध है। Windows के पुराने संस्करणों पर, आप आर्काइविंग के लिए .NET Framework से ZipFile क्लास का उपयोग कर सकते हैं।
Microsoft.PowerShell.Archive मॉड्यूल (C:\Windows\System32\WindowsPowerShell\v1.0\Modules\Microsoft.PowerShell.Archive) में केवल दो cmdlets हैं:
- Compress-Archive
- Expand-Archive
Get-Command -Module Microsoft.PowerShell.Archive | Format-Table -AutoSize
CommandType Name Version Source ----------- ---- ------- ------ Function Compress-Archive 1.0.1.0 Microsoft.PowerShell.Archive Function Expand-Archive 1.0.1.0 Microsoft.PowerShell.Archive
PowerShell: Compress-Archive के साथ ZIP आर्काइव बनाना
Compress-Archive कमांड का निम्न सिंटैक्स है:
Compress-Archive [-Path] String[] [-DestinationPath] String [-CompressionLevel String ] [-Update]
- Path पैरामीटर का उपयोग आर्काइव की जाने वाली फाइलों या फोल्डर्स का पथ निर्दिष्ट करने के लिए किया जाता है
- DestinationPath - ZIP फाइल का पथ निर्दिष्ट करता है
- CompressionLevel - संपीड़न स्तर सेट करता है (
NoCompression,OptimalयाFastest) - Update - मौजूदा ZIP आर्काइव में फाइलों को जोड़ने (अपडेट) की अनुमति देता है
- Force - यदि निर्दिष्ट नाम वाला आर्काइव पहले से मौजूद है, तो इसे ओवरराइट कर दिया जाएगा
टिप: संपीड़न स्तर विकल्प:
- Optimal - संपीड़न स्तर द्वारा अनुकूलन
- Fastest - लिए गए समय द्वारा अनुकूलन
- NoCompression - बिना किसी संपीड़न के
NoCompression विकल्प का उपयोग पहले से संपीड़ित फाइलों (jpg, msi, mp3, आदि) को एक ही ZIP फाइल में आर्काइव करते समय किया जाना चाहिए। इस मामले में, Windows उन्हें संपीड़ित करने में CPU समय बर्बाद नहीं करेगा।
एक फाइल को ज़िप करने के लिए, चलाएं:
Compress-Archive -Path "C:\Logs\WindowsUpdate.log" -DestinationPath C:\Archive\updatelog.zip -CompressionLevel Optimal
आप कई फोल्डर्स की पूरी सामग्री को ज़िप कर सकते हैं (सभी फाइलों और नेस्टेड फोल्डर्स सहित):
Compress-Archive -Path C:\Logs\,C:\Logs2\ -DestinationPath C:\Archive\logs-all.zip -CompressionLevel Optimal
आर्काइव में कई फाइलें या फोल्डर जोड़ने के लिए, उनके नामों को अल्पविराम से अलग करें।
आप केवल विशिष्ट मास्क वाली फाइलों को ZIP आर्काइव में जोड़ सकते हैं। उदाहरण के लिए, निम्न कमांड केवल *.txt फाइलों को ज़िप करेगा।
Compress-Archive -Path C:\Logs\*.txt -DestinationPath C:\Archive\logs-txt.zip –CompressionLevel Fastest
Get-ChildItem cmdlet के साथ अधिक जटिल फिल्टर का उपयोग किया जा सकता है। उदाहरण के लिए, निम्न स्क्रिप्ट आपको डिस्क पर *.docx या *.xlsx एक्सटेंशन वाली शीर्ष 10 सबसे बड़ी फाइलें खोजने और उन्हें आर्काइव में जोड़ने की अनुमति देगी:
Get-ChildItem c:\share\ITdept -Include *.xlsx –Recurse| sort -descending -property length | select -first 10 |Compress-Archive -DestinationPath C:\backup\itdeptdocs.zip
मौजूदा zip आर्काइव में नई फाइलें जोड़ने के लिए, Update कुंजी का उपयोग करें:
Compress-Archive -Path C:\Logs\,C:\logs2\ –Update -DestinationPath C:\Archive\logs-txt.zip
संकेत: क्योंकि Microsoft.PowerShell.Archive मॉड्यूल System.IO.Compression.ZipArchive क्लास का उपयोग करता है, आप 2 GB से बड़ी फाइल को संपीड़ित नहीं कर सकते (क्योंकि अंतर्निहित API की सीमा है)। बड़ी फाइल को संपीड़ित करने का प्रयास करते समय एक त्रुटि दिखाई देगी:
Exception calling "Write" with "3" argument(s): "Stream was too long."
Expand-Archive के साथ ZIP फाइल कैसे निकालें?
आप ZIP फाइलों को अनजिप करने के लिए Expand-Archive cmdlet का उपयोग कर सकते हैं। cmdlet के लिए सिंटैक्स समान है:
Expand-Archive [-Path] String [-DestinationPath] String [-Force] [-Confirm]
उदाहरण के लिए, हमारे द्वारा पहले बनाए गए ZIP आर्काइव को निर्दिष्ट फोल्डर में अनपैक करने और फाइलों को ओवरराइट करने के लिए:
Expand-Archive -Path C:\archive\logs-all.zip -DestinationPath c:\logs -Force
Microsoft.PowerShell.Archive मॉड्यूल के नुकसान:
- आप इसे निकाले बिना आर्काइव की सामग्री नहीं देख सकते
- आप आर्काइव से कुछ फाइलें नहीं निकाल सकते (आपको पूरी आर्काइव फाइल निकालनी होगी)
- आप zip को छोड़कर अन्य आर्काइव फॉर्मेट का उपयोग नहीं कर सकते
- आप पासवर्ड के साथ ZIP आर्काइव की रक्षा नहीं कर पाएंगे
अधिक जटिल मामलों में, आपको अपने PowerShell स्क्रिप्ट में आर्काइविंग करने के लिए थर्ड-पार्टी टूल्स का उपयोग करने की आवश्यकता है। उदाहरण के लिए, 7zip या 7Zip4Powershell मॉड्यूल।
आप 7Zip4Powershell मॉड्यूल इंस्टॉल कर सकते हैं और पासवर्ड से सुरक्षित zip फाइल को इस तरह निकाल सकते हैं:
Install-Module -Name 7Zip4Powershell
Expand-7Zip -ArchiveFileName C:\Archive\Logs.zip -Password "p@ssd0rw" -TargetPath C:\Share\Logs
PowerShell ZipFile क्लास के साथ संपीड़ित फाइलों के साथ काम करना
Windows के पुराने संस्करणों में (Windows 10 या Windows Server 2016 से पहले PowerShell संस्करण < 5.0 के साथ (यदि आप PowerShell संस्करण को अपग्रेड नहीं कर सकते)), आप zip आर्काइव बनाने के लिए अलग ZipFile क्लास (NET Framework 4.5 से) का उपयोग कर सकते हैं।
पहले, क्लास को अपने PowerShell सत्र में लोड करें:
Add-Type -AssemblyName "System.IO.Compression.FileSystem"
फोल्डर को आर्काइव करने के लिए, इस तरह PS स्क्रिप्ट का उपयोग करें:
$SourceFolder = 'C:\Logs'
$ZipFileName = 'C:\PS\logs.zip'
[IO.Compression.ZipFile]::CreateFromDirectory($SourceFolder, $ZipFileName)
ZIP आर्काइव को अपडेट करने और संपीड़न अनुपात सेट करने के लिए, निम्न PowerShell कोड का उपयोग करें:
$addfile = 'C:\temp\new.log'
$compressionLevel = [System.IO.Compression.CompressionLevel]::Fastest
$zip = [System.IO.Compression.ZipFile]::Open($zipFileName, 'update')
[System.IO.Compression.ZipFileExtensions]::CreateEntryFromFile($zip, $addfile, (Split-Path $addfile -Leaf), $compressionLevel)
$zip.Dispose()
$zip.Dispose() कमांड का उपयोग zip फाइल को बंद करने के लिए किया जाता है।
आप ZIP आर्काइव की सामग्री सूचीबद्ध कर सकते हैं:
[System.IO.Compression.ZipFile]::OpenRead($zipFileName).Entries.Name
या आप ZIP आर्काइव की सामग्री को अतिरिक्त जानकारी (संपीड़ित/असंपीड़ित फाइलों का आकार, अंतिम लेखन समय, आदि) के साथ Out-GridView टेबल के रूप में प्रदर्शित कर सकते हैं:
$ZipFileName = "C:\PS\logs1.zip"
$Stream = New-Object IO.FileStream($ZipFileName , [IO.FileMode]::Open)
$ZipArchive = New-Object IO.Compression.ZipArchive($Stream)
$ZipArchive.Entries |
Select-Object Name,
@{Name="File Path";Expression={$_.FullName}},
@{Name="Compressed Size (KB)";Expression={"{0:N2}" -f($_.CompressedLength/1kb)}},
@{Name="UnCompressed Size (KB)";Expression={"{0:N2}" -f($_.Length/1kb)}},
@{Name="File Date";Expression={$_.LastWriteTime}} | Out-GridView
$ZipArchive.Dispose()
$Stream.Close()
$Stream.Dispose()
ZIP फाइल को C:\Logs फोल्डर में निकालने के लिए, निम्न कमांड का उपयोग करें:
$SourceZipFile = 'C:\PS\logs.zip'
$TargetFolder = 'C:\Logs'
[IO.Compression.ZipFile]::ExtractToDirectory($SourceZipFile, $TargetFolder)