วิธีสร้างไฟล์ zip ด้วย PowerShell


คำตอบ:


124

ถ้าคุณมุ่งหน้าไปยัง CodePlex และคว้าส่วนขยายชุมชน PowerShellคุณสามารถใช้write-zipcmdlet ของพวกเขาได้

ตั้งแต่

CodePlex อยู่ในโหมดอ่านอย่างเดียวเพื่อเตรียมการปิดระบบ

คุณสามารถไปที่PowerShell แกลลอรี่


114
ใช่และใช้ 7z เป็นไลบรารีหลักสำหรับ cmdlet การบีบอัดส่วนใหญ่ ฉันรู้เพราะฉันติดตั้งแล้ว) +1
x0n

1
เยี่ยมมาก ๆ x0n ฉันเพิ่มผู้ให้บริการเก็บฟีดใน PSCX ใช้งานได้จริงน้อยลง แต่มีความสนุกมากมาย :)
แมตต์แฮมิลตัน

1
หากใช้ 7z เป็นไปได้ไหมที่จะซิปโดยใช้รหัสผ่าน?
mack

1
@SemiDementedwrite-zip [input file/folder] [output file]
joshschreuder

9
Powershell 5 มาพร้อมกับ cmdlets การบีบอัดข้อมูลถาวรที่สร้างบล็อก
เบอนัวต์ภัทรา

255

ทางเลือก PowerShell ล้วนที่ใช้งานได้กับ PowerShell 3 และ. NET 4.5 (หากคุณสามารถใช้งานได้):

function ZipFiles( $zipfilename, $sourcedir )
{
   Add-Type -Assembly System.IO.Compression.FileSystem
   $compressionLevel = [System.IO.Compression.CompressionLevel]::Optimal
   [System.IO.Compression.ZipFile]::CreateFromDirectory($sourcedir,
        $zipfilename, $compressionLevel, $false)
}

เพียงผ่านเส้นทางแบบเต็มไปยังไฟล์ zip ที่คุณต้องการสร้างและเส้นทางแบบเต็มไปยังไดเรกทอรีที่มีไฟล์ที่คุณต้องการจะซิป


1
สิ่งนี้จำเป็นต้องใช้ Powershell 3.0 หรือเพียงแค่. net 4.5 หรือไม่ ดูเบามากสำหรับคุณสมบัติ powershell จริง ๆ แล้วสำหรับฉันแทนที่จะเป็น. net programming
bwerks

@bwerks ดูส่วน 'แก้ไข' ที่นี่
noam

ฉันกำลังมองหาวิธีบีบอัดไฟล์ขนาดใหญ่เพียงไฟล์เดียว แต่ดูเหมือนว่าไม่มีวิธีการนี้ ฉันต้องเขียนโค้ดที่จะสร้างไดเรกทอรีใหม่คัดลอกไฟล์เดียวที่นั่นบีบอัดไดเรกทอรีนั้นไปยังไฟล์ zip ใหม่แล้วลบไดเรกทอรีเพื่อล้างข้อมูล
Baodad

1
@ Baodad ดูคำตอบของฉัน
Dherik

ควรอ่านไหมว่าฉันต้องการเส้นทางที่สมบูรณ์ เด็กชายที่สับสน! BTW นี่ควรเป็นคำตอบที่ยอมรับ
Kolob Canyon

244

PowerShell v5.0 เพิ่มCompress-ArchiveและExpand-Archivecmdlets หน้าที่เชื่อมโยงมีตัวอย่างเต็มรูปแบบ แต่ส่วนสำคัญของมันคือ:

# Create a zip file with the contents of C:\Stuff\
Compress-Archive -Path C:\Stuff -DestinationPath archive.zip

# Add more files to the zip file
# (Existing files in the zip file with the same name are replaced)
Compress-Archive -Path C:\OtherStuff\*.txt -Update -DestinationPath archive.zip

# Extract the zip file to C:\Destination\
Expand-Archive -Path archive.zip -DestinationPath C:\Destination

11
PowerShell v5.0 เปิดตัวอย่างเป็นทางการแล้วในตอนนี้ นอกจากนี้ยังมาพร้อมกับ Windows 10
Ohad Schneider

วางจำหน่ายแล้วที่นี่: microsoft.com/en-us/download/details.aspx?id=50395
starlocke

2
จากCompress-Archiveคำอธิบายย่อหน้าที่ 2 : "... ขนาดไฟล์สูงสุดที่คุณสามารถบีบอัดได้โดยใช้ Compress-Archive ในปัจจุบันคือ 2 GB นี่เป็นข้อ จำกัด ของ API พื้นฐาน" อย่างไรก็ตามหากคุณใช้System.IO.Compression.ZipFileคุณสามารถข้ามข้อ จำกัด นี้ได้
AMissico

2
ขีด จำกัด 2GB System.IO.Compression.ZipFileได้รับการสืบทอดมาจาก ถ้า. NET Framework ที่คุณใช้ไม่มีขีด จำกัด นี้ CmdLet ไม่ควรถึงขีด จำกัด นี้ ฉันตรวจสอบในรหัส
TravisEz13

2
@Pramod ไม่มี-OutputPathพารามิเตอร์
BrainSlugs83

57

วิธีดั้งเดิมที่มี. NET 4.5 Framework ล่าสุด แต่ไม่มีฟีเจอร์ทั้งหมด:

การสร้าง:

Add-Type -Assembly "System.IO.Compression.FileSystem" ;
[System.IO.Compression.ZipFile]::CreateFromDirectory("c:\your\directory\to\compress", "yourfile.zip") ;

การสกัด:

Add-Type -Assembly "System.IO.Compression.FileSystem" ;
[System.IO.Compression.ZipFile]::ExtractToDirectory("yourfile.zip", "c:\your\destination") ;

ตามที่กล่าวไว้คุณสมบัติโดยสิ้นเชิงน้อยดังนั้นอย่าคาดหวังว่าการเขียนทับธง

ปรับปรุง: ดูด้านล่างสำหรับนักพัฒนาอื่น ๆ ที่มีการขยายตัวในช่วงหลายปี ...


ทำไมคุณถึงต้องใช้วิธีการที่ไม่มีจุดเด่น
พลูโต

นี่ควรเป็นคำตอบที่ยอมรับตามลำดับวันที่โพสต์และแบบอย่าง สำหรับความคิดเห็นที่อัปเดตของคุณ - มีหลายวิธีในการทำเช่นนี้ในขณะนี้ ฉันต้องเผชิญกับความต้องการฟังก์ชั่นนี้และฉันใช้ PowerShell 4 สิ่งแรกที่ฉันพบคือวิธีดั้งเดิม นี่เป็นคำถามที่ดีในปี 2009 ฉันยังคงคิดว่าอาจมีการวิจัยเพิ่มเติมในคำถามเมื่อแรกถาม
DtechNet

45

ติดตั้ง 7zip (หรือดาวน์โหลดรุ่นบรรทัดคำสั่งแทน) และใช้วิธี PowerShell นี้:

function create-7zip([String] $aDirectory, [String] $aZipfile){
    [string]$pathToZipExe = "$($Env:ProgramFiles)\7-Zip\7z.exe";
    [Array]$arguments = "a", "-tzip", "$aZipfile", "$aDirectory", "-r";
    & $pathToZipExe $arguments;
}

คุณสามารถโทรแบบนี้:

create-7zip "c:\temp\myFolder" "c:\temp\myFolder.zip"

6
หาก 7zip อยู่ในเส้นทางของคุณสิ่งที่คุณต้องเขียนคือ "& 7z c: \ temp \ myFolder c: \ temp \ myFolder.zip"
aboy021

5
หากคุณไม่ต้องการติดตั้งคุณสามารถดาวน์โหลดเวอร์ชันบรรทัดคำสั่งแทน (ดูที่หน้าดาวน์โหลดของ 7-zip) มันเป็นเพียงไฟล์ปฏิบัติการและไวยากรณ์คำสั่งเหมือนกัน ปฏิบัติการเป็นชื่ออื่นแม้ว่า; มันเป็น 7za.exe ด้วยเหตุผลบางอย่าง ฉันทำสิ่งนี้ในหลายโครงการและไม่เคยผิดหวัง
jpmc26

ฉันลองใช้เครื่องมือ. net และ Powershell นานเกินไปจนไปถึงเส้นทาง 7zip ที่ใช้งานได้ทันที เคล็ดลับ foreach แบบง่าย ๆ บนไฟล์ $ ทำการหลอกลวง& "C:\Program Files\7-Zip\7z.exe" a -tzip ($file.FullName+".zip") $file.FullName
SebK

17

ล็อตได้เปลี่ยนไปตั้งแต่คำตอบเริ่มต้นถูกโพสต์ นี่คือตัวอย่างล่าสุดบางส่วนที่ใช้คำสั่งCompress-Archive

คำสั่งเพื่อสร้างไฟล์เก็บถาวรใหม่Draft.zipโดยการบีบอัดสองไฟล์Draftdoc.docxและdiagram2.vsdระบุโดยPathพารามิเตอร์ ระดับการบีบอัดที่ระบุสำหรับการดำเนินการนี้คือระดับสูงสุด

Compress-Archive -Path C:\Reference\Draftdoc.docx, C:\Reference\Images\diagram2.vsd -CompressionLevel Optimal -DestinationPath C:\Archives\Draft.Zip

คำสั่งเพื่อสร้างไฟล์เก็บถาวรใหม่Draft.zipโดยการบีบอัดสองไฟล์Draft doc.docxและDiagram [2].vsdระบุโดยLiteralPathพารามิเตอร์ ระดับการบีบอัดที่ระบุสำหรับการดำเนินการนี้คือระดับสูงสุด

Compress-Archive -LiteralPath 'C:\Reference\Draft Doc.docx', 'C:\Reference\Images\Diagram [2].vsd'  -CompressionLevel Optimal -DestinationPath C:\Archives\Draft.Zip

คำสั่งเพื่อสร้างไฟล์เก็บถาวรใหม่Draft.zipในC:\Archivesโฟลเดอร์ ไฟล์เก็บถาวรใหม่มีทุกไฟล์ในโฟลเดอร์C: \ Referenceเนื่องจากมีการใช้อักขระไวด์การ์ดแทนชื่อไฟล์เฉพาะในพารามิเตอร์Path

Compress-Archive -Path C:\Reference\* -CompressionLevel Fastest -DestinationPath C:\Archives\Draft

คำสั่งสร้างไฟล์เก็บถาวรจากทั้งโฟลเดอร์ C:\Reference

Compress-Archive -Path C:\Reference -DestinationPath C:\Archives\Draft

PowerShell ผนวก.zipส่วนขยายเข้ากับชื่อไฟล์โดยอัตโนมัติ


15

แก้ไขสอง - รหัสนี้น่าเกลียด kluge น่าเกลียดจากสมัยก่อน คุณไม่ต้องการมัน

สิ่งนี้บีบอัดเนื้อหาของ.\inถึง.\out.zipด้วย System.IO.Packaging.ZipPackage ทำตามตัวอย่างที่นี่

$zipArchive = $pwd.path + "\out.zip"
[System.Reflection.Assembly]::Load("WindowsBase,Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35")
$ZipPackage=[System.IO.Packaging.ZipPackage]::Open($zipArchive,
  [System.IO.FileMode]"OpenOrCreate", [System.IO.FileAccess]"ReadWrite")
$in = gci .\in | select -expand fullName
[array]$files = $in -replace "C:","" -replace "\\","/"
ForEach ($file In $files)
{
   $partName=New-Object System.Uri($file, [System.UriKind]"Relative")
   $part=$ZipPackage.CreatePart($partName, "application/zip",
      [System.IO.Packaging.CompressionOption]"Maximum")
   $bytes=[System.IO.File]::ReadAllBytes($file)
   $stream=$part.GetStream()
   $stream.Write($bytes, 0, $bytes.Length)
   $stream.Close()
}
$ZipPackage.Close()

แก้ไข: ไม่น่าเชื่อถือสำหรับไฟล์ขนาดใหญ่อาจ> 10mb, YMMV สิ่งที่ ต้องทำกับหลักฐานโดเมนแอปและพื้นที่เก็บข้อมูลแยกต่างหาก วิธี. NET 4.5 ที่เป็นมิตรกว่านี้ทำงานได้ดีจาก PS v3 แต่ต้องการหน่วยความจำเพิ่มเติมในกรณีของฉัน หากต้องการใช้ .NET 4 จาก PS v2, config ไฟล์ต้องไม่สนับสนุน การปรับแต่ง


ปัญหาหลักของ ZipPackage คือไม่ใช่ไฟล์ZIPปกติแต่มีไฟล์ xml เนื้อหา ดู: [วิธีหลีกเลี่ยง [Content_Types] .xml ในระดับ ZipPackage ของ. net - Stack Overflow] ( stackoverflow.com/questions/3748970/… )
aaron

@aaron อีกเหตุผลที่ดีไม่ให้ใช้อีกครั้ง! คุณมีการแข่งขันที่ดุเดือดสำหรับ "ปัญหาสำคัญ" ที่นี่;)
โน

12

ให้ตัวเลือกอื่นด้านล่าง นี่จะบีบอัดโฟลเดอร์แบบเต็มและจะเขียนไฟล์เก็บถาวรไปยังเส้นทางที่กำหนดพร้อมชื่อที่กำหนด

ต้องใช้. NET 3 ขึ้นไป

Add-Type -assembly "system.io.compression.filesystem"

$source = 'Source path here'    
$destination = "c:\output\dummy.zip"

If(Test-path $destination) {Remove-item $destination}

[io.compression.zipfile]::CreateFromDirectory($Source, $destination)

10

นี่คือโซลูชันดั้งเดิมสำหรับ PowerShell v5 โดยใช้ cmdlet Compress-Archive การสร้างไฟล์ Zip โดยใช้ PowerShellPowerShell

ดูเอกสาร Microsoft สำหรับการ บีบอัดเอกสารเก่าการบีบอัด-Archive

ตัวอย่างที่ 1:

Compress-Archive `
    -LiteralPath C:\Reference\Draftdoc.docx, C:\Reference\Images\diagram2.vsd `
    -CompressionLevel Optimal `
    -DestinationPath C:\Archives\Draft.Zip

ตัวอย่างที่ 2:

Compress-Archive `
    -Path C:\Reference\* `
    -CompressionLevel Fastest `
    -DestinationPath C:\Archives\Draft

ตัวอย่างที่ 3:

Write-Output $files | Compress-Archive -DestinationPath $outzipfile

7

สำหรับการบีบอัดฉันจะใช้ไลบรารี่ (7-Zip ก็ดีเหมือนมีคาลแนะนำไล )

หากคุณติดตั้ง7-Zipไดเรกทอรีที่ติดตั้งจะมี7z.exeแอพพลิเคชั่นคอนโซล
คุณสามารถเรียกใช้โดยตรงและใช้ตัวเลือกการบีบอัดใด ๆ ที่คุณต้องการ

หากคุณต้องการมีส่วนร่วมกับ DLL ก็ควรจะเป็นไปได้เช่นกัน
7-Zip เป็นฟรีแวร์และโอเพ่นซอร์ส


2
นี่คือตัวอย่างของการใช้ 7 zip พร้อมการเข้ารหัส AES จาก Powershell: codeblog.theg2.net/2010/02/…
Greg Bray

7

เกี่ยวกับSystem.IO.Packaging.ZipPackageอะไร

มันต้องการ. NET 3.0 หรือสูงกว่า

#Load some assemblys. (No line break!)
[System.Reflection.Assembly]::Load("WindowsBase, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35")

#Create a zip file named "MyZipFile.zip". (No line break!)
$ZipPackage=[System.IO.Packaging.ZipPackage]::Open("C:\MyZipFile.zip",
   [System.IO.FileMode]"OpenOrCreate", [System.IO.FileAccess]"ReadWrite")

#The files I want to add to my archive:
$files = @("/Penguins.jpg", "/Lighthouse.jpg")

#For each file you want to add, we must extract the bytes
#and add them to a part of the zip file.
ForEach ($file In $files)
{
   $partName=New-Object System.Uri($file, [System.UriKind]"Relative")
   #Create each part. (No line break!)
   $part=$ZipPackage.CreatePart($partName, "",
      [System.IO.Packaging.CompressionOption]"Maximum")
   $bytes=[System.IO.File]::ReadAllBytes($file)
   $stream=$part.GetStream()
   $stream.Write($bytes, 0, $bytes.Length)
   $stream.Close()
}

#Close the package when we're done.
$ZipPackage.Close()

ผ่านAnders Hesselbom


5

ทำไมไม่มีใครดูเอกสารประกอบ ?? มีวิธีการที่ได้รับการสนับสนุนในการสร้างไฟล์ zip ที่ว่างเปล่าและเพิ่มแต่ละไฟล์ที่สร้างไว้ในไลบรารี NET 4.5 เดียวกันทุกคนกำลังอ้างอิง

ดูตัวอย่างโค้ดด้านล่าง:

# Load the .NET assembly
Add-Type -Assembly 'System.IO.Compression.FileSystem'

# Must be used for relative file locations with .NET functions instead of Set-Location:
[System.IO.Directory]::SetCurrentDirectory('.\Desktop')

# Create the zip file and open it:
$z = [System.IO.Compression.ZipFile]::Open('z.zip', [System.IO.Compression.ZipArchiveMode]::Create)

# Add a compressed file to the zip file:
[System.IO.Compression.ZipFileExtensions]::CreateEntryFromFile($z, 't.txt', 't.txt')

# Close the file
$z.Dispose()

ฉันขอแนะนำให้คุณเรียกดูเอกสารหากคุณมีคำถามใด ๆ


2
ขอบคุณสำหรับสิ่งนี้มันสมบูรณ์แบบ โดยเฉพาะอย่างยิ่งเมื่อเทียบกับ cmdlet การบีบอัดถาวรซึ่งออกแบบมาไม่ดีและไม่มีวิธีที่ดีในการระบุเส้นทางภายในซิป
Rafael Kitover

4

นี่เป็นสิ่งที่คลุมเครือจริงๆ แต่ใช้ได้ผล 7za.exeเป็น 7zip เวอร์ชันสแตนด์อโลนและสามารถใช้ได้กับแพ็คเกจการติดตั้ง

# get files to be send
$logFiles = Get-ChildItem C:\Logging\*.* -Include *.log | where {$_.Name -match $yesterday} 

foreach ($logFile in $logFiles)
{
    Write-Host ("Processing " + $logFile.FullName)

    # compress file
    & ./7za.exe a -mmt=off ($logFile.FullName + ".7z") $logFile.FullName

}

4

หากมีคนต้องการซิปไฟล์เดียว (ไม่ใช่โฟลเดอร์): http://blogs.msdn.com/b/jerrydixon/archive/2014/08/08/zipping-a-single-file-with-powershell.aspx

[CmdletBinding()]
Param(
     [Parameter(Mandatory=$True)]
     [ValidateScript({Test-Path -Path $_ -PathType Leaf})]
     [string]$sourceFile,

     [Parameter(Mandatory=$True)]
     [ValidateScript({-not(Test-Path -Path $_ -PathType Leaf)})]
     [string]$destinationFile
) 

<#
     .SYNOPSIS
     Creates a ZIP file that contains the specified innput file.

     .EXAMPLE
     FileZipper -sourceFile c:\test\inputfile.txt 
                -destinationFile c:\test\outputFile.zip
#> 

function New-Zip
{
     param([string]$zipfilename)
     set-content $zipfilename 
          ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18))
     (dir $zipfilename).IsReadOnly = $false
}

function Add-Zip
{
     param([string]$zipfilename) 

     if(-not (test-path($zipfilename)))
     {
          set-content $zipfilename 
               ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18))
          (dir $zipfilename).IsReadOnly = $false    

     }

     $shellApplication = new-object -com shell.application
     $zipPackage = $shellApplication.NameSpace($zipfilename)


     foreach($file in $input) 
     { 
          $zipPackage.CopyHere($file.FullName)
          Start-sleep -milliseconds 500
     }
}

dir $sourceFile | Add-Zip $destinationFile

รหัสนี้อาศัยแอพพลิเคชั่นของเชลล์และคาดเดาได้ 500ms เพื่อรอให้เสร็จ ... ฉันไม่เห็นด้วยกับการทำงาน (ในกรณีส่วนใหญ่) แต่มันจะสร้างป๊อปอัปเมื่อคุณใช้มันในทุกกรณีที่การเพิ่มไฟล์บีบอัดใช้เวลาพอสมควร (ทำซ้ำได้ง่ายด้วยการเพิ่มไฟล์ขนาดใหญ่หรือทำงานกับรหัสไปรษณีย์ขนาดใหญ่) นอกจากนี้หากการดำเนินการ zip ใด ๆ ช้ากว่าเวลาพักเครื่องใด ๆ ที่ระบุไว้มันจะล้มเหลวในการเพิ่มไฟล์และทิ้งไว้ข้างหลังกล่องโต้ตอบป๊อปอัพ นี่มันแย่มากสำหรับการเขียนสคริปต์ ฉันยัง downvote คำตอบอื่น ๆ ที่อาศัยวัตถุ COM เพราะมันไม่ได้อยู่กับข้อผิดพลาดเหล่านี้
พลูโต

4

นี่คือรหัสการทำงานซิปไฟล์ทั้งหมดจากโฟลเดอร์ต้นทางและสร้างไฟล์ซิปในโฟลเดอร์ปลายทาง

    $DestZip="C:\Destination\"
    $Source = "C:\Source\"

    $folder = Get-Item -Path $Source

    $ZipTimestamp = Get-Date -format yyyyMMdd-HHmmss;
    $ZipFileName  = $DestZip + "Backup_" + $folder.name + "_" + $ZipTimestamp + ".zip" 

    $Source

    set-content $ZipFileName ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18)) 
    # Wait for the zip file to be created.
    while (!(Test-Path -PathType leaf -Path $ZipFileName))
    {    
        Start-Sleep -Milliseconds 20
    } 
    $ZipFile = (new-object -com shell.application).NameSpace($ZipFileName)

    Write-Output (">> Waiting Compression : " + $ZipFileName)       

    #BACKUP - COPY
    $ZipFile.CopyHere($Source) 

    $ZipFileName
    # ARCHIVE

    Read-Host "Please Enter.."

4
function Zip-File
    {
    param (
    [string]$ZipName,
    [string]$SourceDirectory 

    )
       Add-Type -Assembly System.IO.Compression.FileSystem
       $Compress = [System.IO.Compression.CompressionLevel]::Optimal
       [System.IO.Compression.ZipFile]::CreateFromDirectory($SourceDirectory,
            $ZipName, $Compress, $false)
    }

หมายเหตุ:
ZipName: เส้นทางแบบเต็มของไฟล์ซิปที่คุณต้องการสร้าง

SourceDirectory: พา ธ เต็มไปยังไดเรกทอรีที่มีไฟล์ที่คุณต้องการซิป


3

นี่คือคำตอบของ sonjz รุ่นปรับปรุงเล็กน้อยมันเพิ่มตัวเลือกการเขียนทับ

function Zip-Files(
        [Parameter(Position=0, Mandatory=$true, ValueFromPipeline=$false)]
        [string] $zipfilename,
        [Parameter(Position=1, Mandatory=$true, ValueFromPipeline=$false)]
        [string] $sourcedir,
        [Parameter(Position=2, Mandatory=$false, ValueFromPipeline=$false)]
        [bool] $overwrite)

{
   Add-Type -Assembly System.IO.Compression.FileSystem
   $compressionLevel = [System.IO.Compression.CompressionLevel]::Optimal

    if ($overwrite -eq $true )
    {
        if (Test-Path $zipfilename)
        {
            Remove-Item $zipfilename
        }
    }

    [System.IO.Compression.ZipFile]::CreateFromDirectory($sourcedir, $zipfilename, $compressionLevel, $false)
}

2
คุณช่วยอธิบายรายละเอียดเพิ่มเติมเกี่ยวกับโซลูชันที่คุณให้ได้ไหม
abarisone

ฉันได้รับคำตอบก่อนหน้านี้และปรับปรุงโดยเพิ่มตัวเลือกเขียนทับไม่มากที่จะพูด!
Lou O.

3

นี้ยังควรทำงานสำหรับการบีบอัดไฟล์เดียวโดยไม่ต้องใช้โฟลเดอร์ชั่วคราวและใช้พื้นเมืองสุทธิ 4.5 แปลงจาก C # จาก StackOverflow นี้คำตอบ มันใช้ nicer โดยใช้ไวยากรณ์ที่นำมาจากที่นี่ที่นี่

การใช้งาน:

ZipFiles -zipFilename output.zip -sourceFile input.sql -filename name.inside.zip.sql

รหัส:

function ZipFiles([string] $zipFilename, [string] $sourceFile, [string] $filename)
{
    $fullSourceFile = (Get-Item -Path "$sourceFile" -Verbose).FullName
    $fullZipFile = (Get-Item -Path "$zipFilename" -Verbose).FullName

    Add-Type -AssemblyName System.IO
    Add-Type -AssemblyName System.IO.Compression
    Add-Type -AssemblyName System.IO.Compression.FileSystem

    Using-Object ($fs = New-Object System.IO.FileStream($fullZipFile, [System.IO.FileMode]::Create)) {
         Using-Object ($arch = New-Object System.IO.Compression.ZipArchive($fs, [System.IO.Compression.ZipArchiveMode]::Create)) {
             [System.IO.Compression.ZipFileExtensions]::CreateEntryFromFile($arch, $fullSourceFile, $filename)
        }
    }
}

โดยใช้:

function Using-Object
{
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true)]
        [AllowEmptyString()]
        [AllowEmptyCollection()]
        [AllowNull()]
        [Object]
        $InputObject,

        [Parameter(Mandatory = $true)]
        [scriptblock]
        $ScriptBlock
    )

    try
    {
        . $ScriptBlock
    }
    finally
    {
        if ($null -ne $InputObject -and $InputObject -is [System.IDisposable])
        {
            $InputObject.Dispose()
        }
    }
}

ยอดเยี่ยม ฉันกำลังมองหาวิธีที่จะบีบอัดไฟล์หนึ่งไฟล์โดยไม่ต้องใช้shell.applicationธุรกิจหรือ 7-Zip / โปรแกรมอรรถประโยชน์อื่น ๆ ฉันชอบUsing-Objectฟังก์ชั่นด้วยแม้ว่าฉันจะใช้วิธีสั้นลงและรวดเร็ว
Charlie Joynt

2

ฉันใช้ตัวอย่างนี้เพื่อตรวจสอบโฟลเดอร์สำรองฐานข้อมูลของฉันสำหรับไฟล์สำรองที่ยังไม่บีบอัดบีบอัดโดยใช้ 7-Zip และในที่สุดก็ลบ*.bakไฟล์เพื่อประหยัดพื้นที่ดิสก์บางส่วน ไฟล์ประกาศจะเรียงลำดับตามความยาว (น้อยที่สุดไปหามากที่สุด) ก่อนการบีบอัดเพื่อหลีกเลี่ยงไฟล์บางไฟล์ที่ไม่ถูกบีบอัด

$bkdir = "E:\BackupsPWS"
$7Zip = 'C:\"Program Files"\7-Zip\7z.exe'

get-childitem -path $bkdir | Sort-Object length |
where
{
    $_.extension -match ".(bak)" -and
    -not (test-path ($_.fullname -replace "(bak)", "7z"))
} |
foreach
{
    $zipfilename = ($_.fullname -replace "bak", "7z")
    Invoke-Expression "$7Zip a $zipfilename $($_.FullName)"
}
get-childitem -path $bkdir |
where {
    $_.extension -match ".(bak)" -and
   (test-path ($_.fullname -replace "(bak)", "7z"))
} |
foreach { del $_.fullname }

ที่นี่คุณสามารถตรวจสอบสคริปต์ PowerShell เพื่อการสำรองข้อมูล, การบีบอัดและการถ่ายโอนไฟล์เหล่านั้นผ่าน FTP


2

ในกรณีที่คุณติดตั้ง WinRAR:

function ZipUsingRar([String] $directory, [String] $zipFileName)
{
  Write-Output "Performing operation ""Zip File"" on Target ""Item: $directory Destination:"
  Write-Output ($zipFileName + """")
  $pathToWinRar = "c:\Program Files\WinRAR\WinRar.exe";
  [Array]$arguments = "a", "-afzip", "-df", "-ep1", "$zipFileName", "$directory";
  & $pathToWinRar $arguments;
}

ความหมายของอาร์กิวเมนต์: afzip สร้างไฟล์ zip, df ลบไฟล์, ep1 ไม่ได้สร้างพา ธ ไดเร็กทอรีแบบเต็มภายในไฟล์เก็บถาวร


2

นี่คือตัวอย่างบรรทัดคำสั่งที่สมบูรณ์เพื่อเปิดใช้งานจาก cmd.exe หรือจาก ssh หรือสิ่งที่คุณต้องการ!

powershell.exe -nologo -noprofile -command "&{ Add-Type -A 'System.IO.Compression.FileSystem' [System.IO.Compression.ZipFile]::CreateFromDirectory('c:/path/to/source/folder/', 'c:/path/to/output/file.zip');}"

ความนับถือ


2

กำลังโหลด [System.IO.IOException]คลาสและการใช้วิธีการเป็นขั้นตอนสำคัญในการระงับข้อผิดพลาดที่ไม่ต้องการเนื่องจากความจริงที่ว่าเป็นคลาสที่ไม่ได้มีอยู่ใน PowerShell ดังนั้นจึงคาดว่าจะเกิดข้อผิดพลาดตามบริบทต่างๆ

ฉันควบคุมข้อผิดพลาดสคริปต์ของฉันกับ T แต่ได้รับเอาต์พุต 'ไฟล์สีแดง' พิเศษจำนวนมากขณะใช้[System.IO.Compression.ZipFile]คลาส

function zipFiles(
    [Parameter(Position=0, Mandatory=$true]
    [string] $sourceFolder,
    [Parameter(Position=1, Mandatory=$true]
    [string]$zipFileName,
    [Parameter(Position=2, Mandatory=$false]
    [bool]$overwrite)

{   
Add-Type -Assembly System.IO
Add-Type -Assembly System.IO.Compression.FileSystem

$compressionLevel = [System.IO.Compression.CompressionLevel]::Optimal

$directoryTest = (Test-Path $dailyBackupDestFolder)
$fileTest = (Test-Path $zipFileName)

if ( $directoryTest -eq $false) 
{ 
    New-Item -ItemType Directory -Force -Path $dailyBackupDestFolder 
}

     if ( $fileTest -eq $true)
     {
           if ($overwrite -eq $true ){Remove-Item $zipFileName}
     }   


    try
    {
         [System.IO.Compression.ZipFile]::CreateFromDirectory($sourceFolder,$zipFileName,$compressionLevel)       

    }
    catch [System.IO.IOException] 
    {
       Write-Output ($dateTime + ' | ' + $_.Exception.Message ) | Out-File $logFile -append -force 
    }
} 

สิ่งที่ฉันทำที่นี่คือการตรวจจับข้อผิดพลาด IO เหล่านี้เช่นการเข้าถึงไฟล์ที่มีอยู่แล้วการจับข้อผิดพลาดนั้นและนำไปยังล็อกไฟล์ที่ฉันดูแลด้วยโปรแกรมขนาดใหญ่


2

คำสั่งบรรทัดคำสั่งที่สมบูรณ์ใน Windows สำหรับการบีบอัดและคลายไดเรกทอรีมีดังนี้:

  • สำหรับการบีบอัด:

    powershell.exe -nologo -noprofile -command "& { Add-Type -A 'System.IO.Compression.FileSystem'; [IO.Compression.ZipFile]::CreateFromDirectory('C:\Indus','C:\Indus.zip'); }"
  • สำหรับการแยก:

    powershell.exe -nologo -noprofile -command "& { Add-Type -A 'System.IO.Compression.FileSystem';[IO.Compression.ZipFile]::ExtractToDirectory('C:\Indus.zip','C:\Indus'); }"


-4

สคริปต์นี้ทำซ้ำไดเรกทอรีทั้งหมดและบีบอัดแต่ละอัน

รับ ChildItem - คุณสมบัติ d | foreach {write-zip $ .Name "$ ($ .Name) .zip"}


1
ส่วนเดียวของคำถามนี้ที่เกี่ยวข้องกับคำถามอายุ 7 ปีคือ "write-zip" ซึ่งเป็นคำตอบที่ได้รับการยอมรับในปี 2009
ปฏิเสธ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.