当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 如何使用 PowerShell 创建 ZIP 档案并解压缩文件?

作者:精品下载站 日期:2024-12-14 23:01:56 浏览:16 分类:玩电脑

如何使用 PowerShell 创建 ZIP 档案并解压缩文件?


您可以使用 PowerShell 的功能创建 ZIP 存档并提取它们。在 PowerShell 5.0(Windows 10 上默认安装此 PowerShell 版本)中,可以使用单独的模块 Microsoft.PowerShell.Archive。在旧版本的 Windows 上,您可以使用 .NET Framework 中的 ZipFile 类进行归档。

Microsoft.PowerShell.Archive 模块 (C:\Windows\System32\WindowsPowerShell 1.0\Modules\Microsoft.PowerShell.Archive) 中只有两个 cmdlet:

  • 压缩存档

  • 展开-存档

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 创建 ZIP 档案并解压缩文件?

让我们看一下使用这些 cmdlet 在 PowerShell 脚本中创建和提取 ZIP 存档的示例。

PowerShell:使用 compress-archive 创建 ZIP 存档

压缩存档命令具有以下语法:

Compress-Archive [-Path] String[] [-DestinationPath] String  [-CompressionLevel String ] [-Update]
  • Path参数用于指定要归档的文件或文件夹的路径;

  • DestinationPath - 指定 ZIP 文件的路径;

  • 压缩级别 - 设置压缩级别(

    NoCompression

    ,

    Optimal

    或者

    Fastest

    );

  • 更新 - 允许您在现有 ZIP 存档中添加(更新)文件;

  • 强制 - 如果指定名称的存档已经存在,它将被覆盖。

提示。压缩级别选项:

  • 最佳 — 按压缩级别进行优化;

  • 最快——按所用时间进行优化;

  • 无压缩 — 不进行任何压缩。

将已压缩的文件(jpg、msi、mp3 等)归档到单个 ZIP 文件时,应使用 No Compression 选项。在这种情况下,Windows不会浪费CPU时间来压缩它们。

要压缩单个文件,请运行:

Compress-Archive -Path "C:\Logs\WindowsUpdate.log" -DestinationPath C:\Archive\updatelog.zip -CompressionLevel Optimal

[玩转系统] 如何使用 PowerShell 创建 ZIP 档案并解压缩文件?

您可以压缩多个文件夹的全部内容(包括所有文件和嵌套文件夹):

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 存档中,请使用更新键:

Compress-Archive -Path C:\Logs\,C:\logs2\ -Update -DestinationPath C:\Archive\logs-txt.zip

提示。由于 Microsoft.PowerShell.Archive 模块使用 System.IO. Compression.ZipArchive 类,因此无法压缩大于 2 GB 的文件(因为底层 API 的限制)。当尝试压缩较大的文件时,会出现错误:

[玩转系统] 如何使用 PowerShell 创建 ZIP 档案并解压缩文件?

Exception calling "Write" with "3" argument(s): "Stream was too long."
At  C:\Windows\system32\WindowsPowerShell\v1.0\Modules\Microsoft.PowerShell.Archive\Microsoft.PowerShell.Archive.psm1:805
char:29
+ ...                     $destStream.Write($buffer, 0, $numberOfBytesRead)
+                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : IOException

如何使用 Expand-Archive 提取 ZIP 文件?

您可以使用 Expand-Archive cmdlet 来解压缩 ZIP 文件。该 cmdlet 的语法类似:

Expand-Archive [-Path] String [-DestinationPath] String [-Force]  [-Confirm]

例如,要将我们之前创建的 ZIP 存档解压到指定文件夹并覆盖文件:

Expand-Archive -Path C:\archive\logs-all.zip  -DestinationPath c:\logs -Force

[玩转系统] 如何使用 PowerShell 创建 ZIP 档案并解压缩文件?

Microsoft.PowerShell.Archive 模块的缺点:

  • 如果不解压,您将无法查看存档的内容;

  • 您无法从存档中提取某些文件(您必须提取整个存档文件);

  • 您不能使用除 zip 之外的其他存档格式;

  • 您将无法使用密码保护 ZIP 存档。

在更复杂的情况下,您需要使用第三方工具在 PowerShell 脚本中执行归档。例如,7zip7Zip4Powershell 模块。

您可以安装 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 版本

首先,将该类加载到 PowerShell 会话中:

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

要存档文件夹,请使用如下 PS 脚本:

$SourceFolder = 'C:\Logs'
$ZipFileName = 'C:\PS\logs.zip'
[IO.Compression.ZipFile]::CreateFromDirectory($SourceFolder, $ZipFileName)

[玩转系统] 如何使用 PowerShell 创建 ZIP 档案并解压缩文件?

要更新 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

[玩转系统] 如何使用 PowerShell 创建 ZIP 档案并解压缩文件?

或者,您可以将 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()

[玩转系统] 如何使用 PowerShell 创建 ZIP 档案并解压缩文件?

要将 ZIP 文件解压缩到 C:\Logs 文件夹,请使用以下命令:

$SourceZipFile = 'C:\PS\logs.zip'
$TargetFolder = 'C:\Logs'
[IO.Compression.ZipFile]::ExtractToDirectory($SourceZipFile, $TargetFolder)

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯