如何使用 PowerShell 压缩/解压缩文件或文件夹?


现在,使用 PowerShell 压缩或提取(解压缩)文件或文件夹变得很容易。PowerShell 从 5.1 版本开始添加了存档模块 **(Microsoft.PowerShell.Archive)** 的功能。

如果您使用的是较旧版本的 PowerShell(版本 4.0 或更低版本),则可以从网站或通过命令行下载并安装该模块。但是,仅下载和安装或手动将 Archive 模块复制到 Module 文件夹不起作用,因为它需要一些由 **.Net framework 4.5** 提供的依赖 DLL 文件,因此如果您使用的 **.Net framework** 版本低于 **4.5**,则也需要考虑升级。

一旦您拥有了合适的 PowerShell 版本和 .Net framework 版本,并且如果您已安装 Archive 模块或它是默认安装的,请检查如下所示的命令是否受存档模块支持。

PS C:\WINDOWS\system32> Get-Command -Module *Archive* |ft -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

因此,此模块包含两个命令。**Compress-Archive** 命令用于压缩文件和文件夹,而 **Expand-Archive** 命令用于提取压缩数据。

Compress-Archive 命令用于压缩文件和文件夹。

在开始 Compress-Archive 命令的示例之前,我们首先了解一下 cmdlet 语法。

Compress-Archive
   -LiteralPath <String[]>
   [-DestinationPath] <String>
   [-CompressionLevel <String>]
   -Force
   -Update
   [-PassThru]
   [-WhatIf]
   [-Confirm]
   [<CommonParameters>]

这里,主要参数是 **源文件/文件夹、目标路径、压缩级别、强制** 和 **更新**。

压缩级别

压缩级别有三种类型。

  • **Fastest** - 使用最快的压缩来减少处理时间。这可能导致文件大小更大。
  • **Optimal** - 正常的压缩级别。处理时间取决于文件的大小。如果未使用压缩参数,则这是默认的压缩级别。
  • **NoCompression** - 不压缩源文件。这意味着压缩后文件夹和文件的大小与原始大小相同,只是没有压缩比率。

强制

指定此参数时,它将覆盖文件和文件夹。

更新

此参数将更新从源到目标的较新或已更新的文件,而不是再次压缩整个内容。

示例

1. 压缩单个文件夹。

Compress-Archive C:\temp\* -DestinationPath c:\temp.zip -CompressionLevel
Fastest

以上命令将压缩文件夹 **C:\temp** 到目标路径 C:\,ZIP 文件名为 **temp.zip**,并且压缩级别为 Fastest。

如果您尝试使用已存在的相同目标名称压缩文件夹,则会弹出错误。

PS E:\scripts\Powershell> Compress-Archive C:\temp\* -DestinationPath
c:\temp.zip -CompressionLevel Fastest
Compress-Archive : The archive file C:\temp.zip already exists. Use the -
Update parameter to update the existing
archive file or use the -Force parameter to overwrite the existing archive
file.
At line:1 char:1
+ Compress-Archive C:\temp\* -DestinationPath c:\temp.zip -CompressionL ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (C:\temp.zip:String) [Compress-
Archive], IOException
+ FullyQualifiedErrorId : ArchiveFileExists,Compress-Archive

要覆盖目标文件,您需要使用 –Force 参数。

Compress-Archive C:\temp\* -DestinationPath c:\temp.zip -CompressionLevel
Fastest -Force

如果您想更新 temp 文件夹中的任何文件,并且需要更新目标 zip 文件,则需要使用 **–Update** 参数。当您使用 **Update** 参数时,不需要使用 **-Force** 参数,因为 **–Update** 参数也会覆盖目标文件并更新文件,即使目标文件不存在,它也会创建一个新文件。

Compress-Archive C:\temp\* -DestinationPath c:\temp.zip -CompressionLevel
Fastest -Update

2. 压缩多个文件和文件夹。

不同位置的多个文件 -

$compress = @{
   Path = "C:\temp\ComputerInformation.csv","D:\cars.xml"
   DestinationPath = "C:\archive.zip"
   CompressionLevel = "Fastest"
}
Compress-Archive @compress -Verbose

不同位置的多个文件夹 -

$compress = @{
   Path = "C:\temp\*","C:\Dell\*"
   DestinationPath = "C:\folderarchive.zip"
   CompressionLevel = "Fastest"
}
Compress-Archive @compress -Force -Verbose

Expand-Archive 命令。

**Expand-Archive** 命令用于提取 ZIP 文件。与 **Compress-Archive** 命令相比,此命令相对简单,因为它只需要源文件和目标 ZIP 文件。

在下面的示例中,我们将提取 folderarchive.zip 文件到目标位置。

Expand-Archive C:\folderarchive.zip -DestinationPath C:\Unzipedfolder -Verbose

这里,目标文件夹 **UnzipedFolder** 在目标路径中不存在,但如果不存在,cmdlet 会自动创建该文件夹。如果文件夹已存在,则需要使用 –Force 参数来覆盖文件和文件夹。

Expand-Archive C:\folderarchive.zip -DestinationPath C:\Unzipedfolder –Force
-Verbose

更新于: 2020-07-13

2K+ 阅读量

开启你的 职业生涯

通过完成课程获得认证

立即开始
广告