如何使用 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