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.docx
和 diagram2.vsd
。
示例 3:压缩包含根目录的目录
此示例压缩目录并创建存档文件,其中包括根目录以及所有其文件和子目录。 存档文件具有目录结构,因为 Path 指定根目录。
Compress-Archive -Path C:\Reference -DestinationPath C:\Archives\Draft.zip
Compress-Archive
使用 Path 参数来指定根目录 C:\Reference
。 DestinationPath 参数指定存档文件的位置。 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
。 每个 FileInfo 和 DirectoryInfo 对象都向下发送到管道。
Compress-Archive
将每个对象添加到 PipelineDir.zip
存档。 未指定 Path 参数,因为管道对象将接收到参数位置 0。
示例 8:递归如何影响存档
此示例显示递归如何复制存档中的文件。 例如,如果将 Get-ChildItem
用于 Recurse 参数。 递归过程时,每个 fileInfo 和 DirectoryInfo 对象都会向下发送管道并添加到存档中。
Get-ChildItem -Path C:\TestLog -Recurse |
Compress-Archive -DestinationPath C:\Archives\PipelineRecurse.zip
C:\TestLog
目录不包含任何文件。 它包含一个名为 testsub
的子目录,其中包含 testlog.txt
文件。
Get-ChildItem
使用 Path 参数来指定根目录 C:\TestLog
。 Recurse 参数处理文件和目录。 为 testsub
和 FileInfo 对象创建 DirectoryInfo 对象 testlog.txt
。
每个对象沿着管道发送到 Compress-Archive
。 DestinationPath 指定存档文件的位置。 未指定 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 |
输入
可以通过管道将包含路径的字符串传递给一个或多个文件。
输出
None
默认情况下,此 cmdlet 不返回任何输出。
如果使用 PassThru 参数,则此 cmdlet 会返回 FileInfo 对象。
备注
使用递归并在管道中发送对象可以复制存档中的文件。 例如,如果将 Get-ChildItem
与 Recurse 参数一起使用,则向下发送管道的每个 FileInfo 和 DirectoryInfo 对象会添加到存档。
Compress-Archive
cmdlet 使用 UTF-8 编码。 其他 ZIP 存档工具可能使用不同的编码方案。 如果文件名不是使用 UTF-8 编码存储的,则提取该文件时,Expand-Archive
将使用存档中找到的原始值。 这可能会导致文件名与存档中存储的源文件名不同。