Làm cách nào để tạo một kho lưu trữ zip với PowerShell?


Câu trả lời:


124

Nếu bạn truy cập CodePlex và lấy Tiện ích mở rộng cộng đồng PowerShell , bạn có thể sử dụng write-ziplệnh ghép ngắn của họ .

Từ

CodePlex ở chế độ chỉ đọc để chuẩn bị tắt máy

bạn có thể vào Thư viện PowerShell .


114
Đúng, và nó sử dụng 7z làm thư viện lõi cho hầu hết các lệnh ghép ngắn nén của nó. Tôi biết, vì tôi đã triển khai nó;) +1
x0n

1
lol làm việc tốt, x0n. Tôi đã bổ sung cho nhà cung cấp cửa hàng thức ăn chăn nuôi trong PSCX. Hơi ít thực tế nhưng tấn niềm vui. :)
Matt Hamilton

1
Nếu nó sử dụng 7z, có thể nén bằng mật khẩu không?
mack

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

9
Powershell 5 đi kèm với một lệnh ghép ngắn Nén-Lưu trữ tạo ra .zip blog.technet.microsoft.com/heyscriptingguy/2015/08/13/ phỏng
Benoit Patra

255

Một thay thế PowerShell thuần hoạt động với PowerShell 3 và .NET 4.5 (nếu bạn có thể sử dụng nó):

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

Chỉ cần chuyển vào đường dẫn đầy đủ đến kho lưu trữ zip mà bạn muốn tạo và đường dẫn đầy đủ đến thư mục chứa các tệp bạn muốn nén.


1
Điều này thực sự cần Powershell 3.0, hay chỉ .net 4.5? Có vẻ rất nhẹ đối với các tính năng quyền hạn thực tế đối với tôi, thay vào đó chỉ là lập trình .net.
bwerks

@bwerks xem phần 'chỉnh sửa' tại đây
trưa

Tôi đang tìm cách để nén một tệp lớn, nhưng dường như không có phương pháp nào cho việc này. Tôi đã phải viết mã sẽ tạo một thư mục mới, sao chép tệp duy nhất ở đó, nén thư mục đó sang tệp zip mới, sau đó xóa thư mục để dọn sạch.
Baodad

1
@Baodad, xem câu trả lời của tôi.
Dherik

Nên đọc rằng tôi cần đường dẫn đầy đủ. Cậu bé thật khó hiểu! BTW đây phải là câu trả lời được chấp nhận
Kolob Canyon

244

PowerShell v5.0 thêm Compress-ArchiveExpand-Archivelệnh ghép ngắn. Các trang được liên kết có ví dụ đầy đủ, nhưng ý chính của nó là:

# 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 đã được phát hành chính thức. Nó cũng đi kèm với Windows 10.
Ohad Schneider


2
Từ Đoạn 2 của Compress-ArchiveMô tả: "... kích thước tệp tối đa bạn có thể nén bằng cách sử dụng Nén-Lưu trữ hiện là 2 GB. Đây là giới hạn của API cơ bản" Tuy nhiên, nếu bạn sử dụng, System.IO.Compression.ZipFilebạn có thể bỏ qua giới hạn này.
AMissico

2
Giới hạn 2GB được kế thừa từ System.IO.Compression.ZipFile. Nếu .NET framework bạn đang sử dụng không có giới hạn này, CmdLet không nên đạt giới hạn này. Tôi đã xác minh trong mã.
TravisEz13

2
@Pramod không có -OutputPaththam số.
BrainSlugs83

57

Một cách riêng với khung .NET 4.5 mới nhất, nhưng hoàn toàn không có tính năng:

Sự sáng tạo:

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

Khai thác:

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

Như đã đề cập, hoàn toàn không có tính năng, vì vậy đừng mong đợi một cờ ghi đè .

CẬP NHẬT: Xem bên dưới cho các nhà phát triển khác đã mở rộng về điều này trong những năm qua ...


Tại sao bạn sẽ sử dụng phương pháp kỳ công?
Sao Diêm Vương

Đây phải là câu trả lời được chấp nhận theo thứ tự ngày đăng và tiền lệ. Theo nhận xét cập nhật của bạn - thực sự có rất nhiều cách để làm điều này ngay bây giờ. Tôi phải đối mặt với việc cần chức năng này và tôi đang dùng PowerShell 4, điều đầu tiên tôi tìm thấy là cách riêng. Đây là một câu hỏi hay trong năm 2009. Tôi vẫn nghĩ rằng có thể có thêm nghiên cứu được trình bày trong câu hỏi khi được hỏi ban đầu.
DtechNet

45

Cài đặt 7zip (hoặc tải xuống phiên bản dòng lệnh thay thế) và sử dụng phương thức PowerShell này:

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

Bạn có thể gọi nó như thế này:

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

6
Nếu 7zip nằm trong đường dẫn của bạn thì tất cả những gì bạn cần viết là "& 7z c: \ temp \ myFolder c: \ temp \ myFolder.zip"
aboy021

5
Nếu bạn không muốn cài đặt nó, bạn có thể tải xuống phiên bản dòng lệnh thay thế. (Chỉ cần xem trên trang Tải xuống của 7-zip.) Nó chỉ là một tệp thực thi và cú pháp lệnh là như nhau. Việc thực thi là một tên khác, mặc dù; Đó là 7za.exe vì một số lý do. Tôi đã thực hiện điều này trên một số dự án và chưa bao giờ thất vọng.
jpmc26

Tôi đã thử với các công cụ .net và Powershell quá lâu cho đến khi đi theo đường dẫn 7zip hoạt động ngay lập tức. Vòng lặp foreach đơn giản trên tập tin $ thực hiện thủ thuật& "C:\Program Files\7-Zip\7z.exe" a -tzip ($file.FullName+".zip") $file.FullName
SebK

17

Rất nhiều đã thay đổi kể từ khi câu trả lời ban đầu được đăng. Dưới đây là một số ví dụ mới nhất sử dụng lệnh Compress-Archive .

Lệnh tạo tệp lưu trữ mới Draft.zip, bằng cách nén hai tệp Draftdoc.docxdiagram2.vsdđược chỉ định bởi Paththam số. Mức nén được chỉ định cho thao tác này là Tối ưu.

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

Lệnh tạo tệp lưu trữ mới Draft.zip, bằng cách nén hai tệp Draft doc.docxDiagram [2].vsdđược chỉ định bởi LiteralPaththam số. Mức nén được chỉ định cho thao tác này là Tối ưu.

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

Lệnh tạo tệp lưu trữ mới Draft.zip, trong C:\Archivesthư mục. Tệp lưu trữ mới chứa mọi tệp trong thư mục C: \ Reference , vì ký tự đại diện được sử dụng thay cho tên tệp cụ thể trong tham số Đường dẫn .

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

Lệnh tạo một kho lưu trữ từ toàn bộ thư mục, C:\Reference

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

PowerShell tự động thêm .zipphần mở rộng vào tên tệp.


15

Chỉnh sửa hai - Mã này là một kluge xấu xí, xấu xí từ thời xa xưa. Bạn không muốn điều đó.

Đây nén nội dung của .\inđể .\out.zipvới System.IO.Packaging.ZipPackage làm theo tấm gương ở đây

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

Chỉnh sửa: Không đáng tin cậy cho các tệp lớn hơn, có thể> 10mb, YMMV. Một cái gì đó để làm với bằng chứng appdomain và lưu trữ bị cô lập. Cách tiếp cận .NET 4.5 thân thiện hơn hoạt động độc đáo từ PS v3, nhưng muốn có thêm bộ nhớ trong trường hợp của tôi. Để sử dụng .NET 4 từ PS v2, các tệp cấu hình cần một tinh chỉnh không được hỗ trợ .


vấn đề chính của ZipPackage là nó không phải là tệp ZIP bình thường , nhưng chứa tệp xml nội dung. xem: [cách tránh [Content_Types] .xml trong lớp ZipPackage của .net - Tràn ngăn xếp] ( stackoverflow.com/questions/3736170/iêu )
aaron

@aaron Một lý do tuyệt vời nữa để không sử dụng điều này một lần nữa! Bạn đã có sự cạnh tranh gay gắt cho "vấn đề lớn" ở đây;)
trưa

12

Đưa ra bên dưới một lựa chọn khác. Điều này sẽ nén một thư mục đầy đủ và sẽ ghi lưu trữ vào một đường dẫn cụ thể với tên đã cho.

Yêu cầu .NET 3 trở lên

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

Đây là một giải pháp gốc cho PowerShell v5, sử dụng lệnh ghép ngắn Compress-Archive Tạo các tệp Zip bằng PowerShell .

Xem thêm Microsoft Docs cho Nén-Lưu trữ .

Ví dụ 1:

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

Ví dụ 2:

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

Ví dụ 3:

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

7

Để nén, tôi sẽ sử dụng một thư viện (7-Zip là tốt như Michal gợi ý ).

Nếu bạn cài đặt 7-Zip , thư mục đã cài đặt sẽ chứa 7z.exeứng dụng bảng điều khiển.
Bạn có thể gọi nó trực tiếp và sử dụng bất kỳ tùy chọn nén nào bạn muốn.

Nếu bạn muốn tham gia với DLL, điều đó cũng có thể.
7-Zip là phần mềm miễn phí và mã nguồn mở.


2
Dưới đây là một ví dụ về việc sử dụng 7 zip với mã hóa AES từ Powershell: codeblog.theg2.net/2010/02/ Kẻ
Greg Bray

7

Thế còn System.IO.Packaging.ZipPackage?

Nó sẽ yêu cầu .NET 3.0 trở lên.

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

thông qua Anders Hesselbom


5

Tại sao không ai nhìn vào tài liệu ?? Có một phương pháp được hỗ trợ để tạo một tệp zip trống và thêm các tệp riêng lẻ vào tệp thư viện .NET 4.5 mà mọi người đều tham khảo.

Xem bên dưới để biết ví dụ về mã:

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

Tôi khuyến khích bạn duyệt tài liệu nếu bạn có bất kỳ câu hỏi.


2
Cảm ơn bạn vì điều này, điều này là hoàn hảo. Đặc biệt so với lệnh ghép ngắn Nén-Lưu trữ được thiết kế tồi và không có cách nào tốt để chỉ định các đường dẫn bên trong zip.
Rafael Kitover

4

Điều này thực sự tối nghĩa nhưng hoạt động. 7za.exe là phiên bản độc lập của 7zip và có sẵn với gói cài đặt.

# 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

Nếu ai đó cần nén một tệp duy nhất (chứ không phải thư mục): http://bloss.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

Mã này dựa trên một ứng dụng shell và sau đó đoán 500ms để đợi nó kết thúc ... Tôi không đồng ý rằng nó hoạt động (trong hầu hết các trường hợp). Nhưng nó tạo ra các cửa sổ bật lên khi bạn sử dụng nó trong mọi trường hợp khi thêm tệp nén mất một khoảng thời gian (dễ dàng sao chép bằng cách thêm tệp lớn hoặc làm việc với các khóa lớn). Ngoài ra, nếu bất kỳ thao tác zip nào chậm hơn bất kỳ thời gian ngủ nào được chỉ định, nó sẽ không thể thêm tệp và để lại hộp thoại bật lên. Điều này là khủng khiếp cho kịch bản. Tôi cũng đánh giá thấp câu trả lời khác dựa trên đối tượng COM vì nó không giải quyết được những cạm bẫy này.
Sao Diêm Vương

4

Đây là mã làm việc, nén tất cả các tệp từ thư mục nguồn và tạo tệp zip trong thư mục đích.

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

Ghi chú:
ZipName: Đường dẫn đầy đủ của tệp Zip mà bạn muốn tạo.

SourceDirectory: Đường dẫn đầy đủ đến thư mục chứa các tệp mà bạn muốn nén.


3

Đây là một phiên bản cải tiến của câu trả lời của sonjz, nó thêm tùy chọn ghi đè.

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
Bạn có thể vui lòng giải thích thêm câu trả lời của bạn thêm một chút mô tả về giải pháp bạn cung cấp không?
abarisone

Tôi đã lấy một câu trả lời trước đó và cải thiện nó bằng cách thêm tùy chọn ghi đè, không cần nói nhiều nữa!
Lou O.

3

Điều này cũng sẽ hoạt động để nén một tệp mà không sử dụng thư mục tạm thời và sử dụng .Net 4.5 gốc, được chuyển đổi từ C # từ câu trả lời StackOverflow này . Nó sử dụng một cú pháp đẹp hơn bằng cách sử dụng cú pháp được lấy từ đây .

Sử dụng:

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

Mã số:

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

Sử dụng:

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

Thông minh. Tôi đang tìm cách để nén tệp ONE mà không cần sử dụng shell.applicationdoanh nghiệp đó hoặc 7-Zip / các tiện ích riêng biệt khác. Tôi cũng thích Using-Objectchức năng này, mặc dù tôi đã thực hiện một cách tiếp cận ngắn hơn, nhanh chóng và không có điều đó.
Charlie Joynt

2

Tôi sử dụng đoạn mã này để kiểm tra thư mục sao lưu cơ sở dữ liệu của mình để biết các tệp sao lưu chưa được nén, nén chúng bằng 7-Zip và cuối cùng xóa các *.baktệp để tiết kiệm dung lượng đĩa. Các tệp thông báo được sắp xếp theo độ dài (nhỏ nhất đến lớn nhất) trước khi nén để tránh một số tệp không được nén.

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

Tại đây, bạn có thể kiểm tra tập lệnh PowerShell để sao lưu, nén và chuyển các tệp đó qua FTP .


2

Trong trường hợp bạn đã cài đặt 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;
}

Ý nghĩa của các đối số: afzip tạo tệp lưu trữ zip, df xóa các tệp, ep1 không tạo đường dẫn thư mục đầy đủ trong kho lưu trữ


2

Dưới đây là một ví dụ dòng lệnh hoàn chỉnh để khởi chạy từ cmd.exe hoặc từ ssh hoặc những gì bạn muốn!

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');}"

Trân trọng


2

Đang tải [System.IO.IOException] lớp và sử dụng các phương thức của nó là một bước quan trọng để loại bỏ các lỗi không mong muốn, vì thực tế đó là một lớp không có nguồn gốc từ PowerShell, vì vậy hãy mong đợi các bối cảnh lỗi khác nhau mà không có nó.

Tôi đã kiểm soát lỗi tập lệnh của mình thành T, nhưng có thêm đầu ra 'tệp đỏ' tồn tại trong khi sử dụng [System.IO.Compression.ZipFile]lớp

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

Những gì tôi đang làm ở đây là bắt các lỗi IO này, chẳng hạn như truy cập các tệp đã tồn tại, bắt lỗi đó và hướng nó đến một logfile mà tôi đang duy trì với một chương trình lớn hơn.


2

Các lệnh dòng lệnh hoàn chỉnh trong Windows để nén và trích xuất thư mục như sau:

  • Để nén:

    powershell.exe -nologo -noprofile -command "& { Add-Type -A 'System.IO.Compression.FileSystem'; [IO.Compression.ZipFile]::CreateFromDirectory('C:\Indus','C:\Indus.zip'); }"
  • Để giải nén:

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


-4

Kịch bản này lặp lại tất cả các thư mục và zip mỗi thư mục

Get-ChildItem-Đóng góp d | foreach {write-zip $ .Name "$ ($ .Name) .zip"}


1
Phần duy nhất của câu hỏi này liên quan đến câu hỏi 7 tuổi là "write-zip", đó là câu trả lời được chấp nhận vào năm 2009.
Từ chối
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.