Compress-Archive

从指定的文件和目录创建压缩的 ZIP 存档。

语法

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

说明

Compress-Archive cmdlet 从一个或多个指定的文件或目录创建压缩的存档文件。 存档可将多个文件打包,还可以将其压缩为单个压缩文件以便分发和存储。 可以使用 CompressionLevel 参数指定的压缩算法来压缩存档文件

Compress-Archive cmdlet 使用 System.IO.Compression.ZipArchive API 来压缩文件。 该 API 将最大文件大小限制为 2 GB。 .NET API 适用于符合 PKWARE Inc 的官方 ZIP 文件格式规范的文件。有关详细信息,请参阅 System.IO.Compression.ZipArchive

注意

创建或更新存档文件时,Compress-Archive cmdlet 会忽略隐藏文件和文件夹。 在非 Windows 计算机上,这包括名称以句点 (.) 字符开头的文件和文件夹。

若要确保隐藏的文件和文件夹压缩到存档中,请改用 .NET API。

一些示例使用 splatting 来减少代码示例的行长度。 有关详细信息,请参阅 about_Splatting

示例

示例 1:压缩文件以创建存档文件

此示例压缩文件来自不同目录并创建一个存档文件。 通配符用于获取具有特定文件扩展名的所有文件。 存档文件中没有目录结构,因为 Path 仅指定文件名。

$compress = @{
  Path = "C:\Reference\Draftdoc.docx", "C:\Reference\Images\*.vsd"
  CompressionLevel = "Fastest"
  DestinationPath = "C:\Archives\Draft.zip"
}
Compress-Archive @compress

Path 参数接受特定文件名,以及包含通配符“*.vsd”的文件名。 Path 使用逗号分隔的列表从不同的目录获取文件。 压缩级别“最快”可减少处理时间。 DestinationPath 参数指定 Draft.zip 文件的位置。 Draft.zip 文件包含 Draftdoc.docx 以及包含 .vsd 扩展名的所有文件。

示例 2:使用 LiteralPath 压缩文件

此示例压缩特定的命名文件并创建新的存档文件。 存档文件中没有目录结构,因为 Path 仅指定文件名。

$compress = @{
LiteralPath= "C:\Reference\Draft Doc.docx", "C:\Reference\Images\diagram2.vsd"
CompressionLevel = "Fastest"
DestinationPath = "C:\Archives\Draft.zip"
}
Compress-Archive @compress

使用绝对路径和文件名,因为 LiteralPath 参数不接受通配符。 Path 使用逗号分隔的列表从不同的目录获取文件。 压缩级别“最快”可减少处理时间。 DestinationPath 参数指定 Draft.zip 文件的位置。 Draft.zip 文件仅包含 Draftdoc.docxdiagram2.vsd

示例 3:压缩包含根目录的目录

此示例压缩目录并创建存档文件,其中包括根目录以及所有其文件和子目录。 存档文件具有目录结构,因为 Path 指定根目录。

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

Compress-Archive 使用 Path 参数来指定根目录 C:\ReferenceDestinationPath 参数指定存档文件的位置。 Draft.zip 存档包括 Reference 根目录,以及所有其文件和子目录。

示例 4:压缩不包含根目录的目录

此示例压缩目录并创建存档文件,其中包括根目录,因为 Path 使用星号 (*) 通配符。 存档包括目录结构,其中包括根目录的文件和子目录。

Compress-Archive -Path C:\Reference\* -DestinationPath C:\Archives\Draft.zip

Compress-Archive 使用 Path 参数来指定根目录,C:\Reference 具有星号 (*) 通配符。 DestinationPath 参数指定存档文件的位置。 Draft.zip 存档包括根目录的文件和子目录。 存档中不包含 Reference 根目录。

示例 5:仅压缩根目录中的文件

此示例仅压缩根目录中的文件并创建存档文件。 存档中没有目录结构,因为仅压缩文件。

Compress-Archive -Path C:\Reference\*.* -DestinationPath C:\Archives\Draft.zip

Compress-Archive 使用 Path 参数来指定根目录,C:\Reference 具有星点星 (*.*) 通配符。 DestinationPath 参数指定存档文件的位置。 Draft.zip 存档仅包含 Reference 根目录的文件,不包含根目录。

示例 6:使用管道存档文件

此示例将文件发送到管道以创建存档。 存档文件中没有目录结构,因为 Path 仅指定文件名。

Get-ChildItem -Path C:\Reference\Afile.txt, C:\Reference\Images\Bfile.txt |
  Compress-Archive -DestinationPath C:\Archives\PipelineFiles.zip

Get-ChildItem 使用 Path 参数指定不同目录中的两个文件。 每个文件由 FileInfo 对象表示,并将管道向下发送到 Compress-Archive。 这两个指定的文件存档在 PipelineFiles.zip 中。

示例 7:使用管道存档目录

此示例将目录向下发送到管道以创建存档。 文件作为 FileInfo 对象发送,目录作为 DirectoryInfo 对象发送。 存档的目录结构不包括根目录,但其文件和子目录包含在存档中。

Get-ChildItem -Path C:\LogFiles | Compress-Archive -DestinationPath C:\Archives\PipelineDir.zip

Get-ChildItem 使用 Path 参数来指定根目录 C:\LogFiles。 每个 FileInfoDirectoryInfo 对象都向下发送到管道。

Compress-Archive 将每个对象添加到 PipelineDir.zip 存档。 未指定 Path 参数,因为管道对象将接收到参数位置 0。

示例 8:递归如何影响存档

此示例显示递归如何复制存档中的文件。 例如,如果将 Get-ChildItem 用于 Recurse 参数。 递归过程时,每个 fileInfoDirectoryInfo 对象都会向下发送管道并添加到存档中。

Get-ChildItem -Path C:\TestLog -Recurse |
  Compress-Archive -DestinationPath C:\Archives\PipelineRecurse.zip

C:\TestLog 目录不包含任何文件。 它包含一个名为 testsub 的子目录,其中包含 testlog.txt 文件。

Get-ChildItem 使用 Path 参数来指定根目录 C:\TestLogRecurse 参数处理文件和目录。 为 testsubFileInfo 对象创建 DirectoryInfo 对象 testlog.txt

每个对象沿着管道发送到 Compress-ArchiveDestinationPath 指定存档文件的位置。 未指定 Path 参数,因为管道对象将接收到参数位置 0。

以下摘要描述了包含重复文件 PipelineRecurse.zip 存档的内容:

  • DirectoryInfo 对象创建 testsub 目录,并包含反映原始目录结构的 testlog.txt 文件。
  • FileInfo 对象在存档的根目录中创建重复的 testlog.txt。 由于递归将文件对象发送到 Compress-Archive,因此创建了重复文件。 此行为符合预期,因为向下发送到管道的每个对象会添加到存档。

示例 9:更新现有存档文件

此示例更新 C:\Archives 目录中的现有存档文件 Draft.zip。 在此示例中,现有存档文件包含根目录及其文件和子目录。

Compress-Archive -Path C:\Reference -Update -DestinationPath C:\Archives\Draft.zip

该命令将 Draft.zip 更新为 C:\Reference 目录及其子目录中现有文件的更新版本。 此外,已添加到 C:\Reference 或其子目录的新文件包含在更新的 Draft.zip 存档中。

参数

-CompressionLevel

指定创建存档文件时要应用的压缩程度。 较快的压缩需要的文件创建时间较少,但可能导致文件大小较大。

如果未指定此参数,则命令使用默认值 Optimal

以下是此参数可接受的值:

  • 最快。 使用提供的最快压缩方法来缩短处理时间。 压缩越快,文件大小越大。
  • NoCompression。 不要压缩源文件。
  • 最佳: 处理时间取决于文件大小。
类型:String
接受的值:Optimal, NoCompression, Fastest
Position:Named
默认值:Optimal
必需:False
接受管道输入:False
接受通配符:False

-Confirm

提示你在运行 cmdlet 之前进行确认。

类型:SwitchParameter
别名:cf
Position:Named
默认值:False
必需:False
接受管道输入:False
接受通配符:False

-DestinationPath

此参数是必需的,并指定存档输出文件的路径。 DestinationPath 应包括输出压缩文件的名称,以及指定压缩文件的绝对或相对路径。

如果 DestinationPath 中的文件名没有 .zip 文件扩展名,该 cmdlet 会添加 .zip 文件扩展名。

类型:String
Position:1
默认值:None
必需:True
接受管道输入:False
接受通配符:False

-Force

使用此参数覆盖现有存档文件。

类型:SwitchParameter
Position:Named
默认值:False
必需:True
接受管道输入:False
接受通配符:False

-LiteralPath

指定想要添加到存档压缩文件的文件的路径。 与 Path 参数不同,LiteralPath 的值严格按照所键入的形式使用。 不会将任何字符解释为通配符。 如果路径包括转义符,用单引号将每个转义符括起来,以指示 PowerShell 不要将任何字符解释为转义序列。 若要指定多个路径,并将文件包括在输出压缩文件的多个位置中,请使用逗号分隔这些路径。

类型:String[]
别名:PSPath
Position:Named
默认值:None
必需:True
接受管道输入:True
接受通配符:False

-PassThru

使 cmdlet 输出表示创建的存档文件的文件对象。

此参数是在 PowerShell 6.0 中引入的。

类型:SwitchParameter
Position:Named
默认值:False
必需:False
接受管道输入:False
接受通配符:False

-Path

指定想要添加到存档压缩文件的文件的路径。 若要指定多个路径,并将文件包括多个位置中,请使用逗号分隔这些路径。

此参数接受通配符字符。 通过通配符字符,可以将目录中的所有文件添加到存档文件。

对根目录使用通配符会影响存档的内容:

  • 若要创建包含根目录以及所有其文件和子目录的存档,请在没有通配符的 Path 指定根目录。 例如:-Path C:\Reference
  • 若要创建不包含根目录,但压缩所有其文件和子目录的存档,请使用星号 (*) 通配符。 例如:-Path C:\Reference\*
  • 若要创建仅压缩根目录中的文件的存档,请使用星点星 (*.*) 通配符。 根目录不包括在存档中。 例如:-Path C:\Reference\*.*
类型:String[]
Position:0
默认值:None
必需:True
接受管道输入:True
接受通配符:True

-Update

使用具有相同名称的较新文件版本替换存档中的旧文件版本,以更新指定的存档。 此外,还可添加此参数,将文件添加到现有存档。

类型:SwitchParameter
Position:Named
默认值:False
必需:True
接受管道输入:False
接受通配符:False

-WhatIf

显示运行该 cmdlet 时会发生什么情况。 cmdlet 未运行。

类型:SwitchParameter
别名:wi
Position:Named
默认值:False
必需:False
接受管道输入:False
接受通配符:False

输入

String

可以通过管道将包含路径的字符串传递给一个或多个文件。

输出

None

默认情况下,此 cmdlet 不返回任何输出。

FileInfo

如果使用 PassThru 参数,则此 cmdlet 会返回 FileInfo 对象。

备注

使用递归并在管道中发送对象可以复制存档中的文件。 例如,如果将 Get-ChildItemRecurse 参数一起使用,则向下发送管道的每个 FileInfoDirectoryInfo 对象会添加到存档。

Compress-Archive cmdlet 使用 UTF-8 编码。 其他 ZIP 存档工具可能使用不同的编码方案。 如果文件名不是使用 UTF-8 编码存储的,则提取该文件时,Expand-Archive 将使用存档中找到的原始值。 这可能会导致文件名与存档中存储的源文件名不同。