Compress-Archive
从指定的文件和目录创建压缩存档或压缩文件。
语法
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 将最大文件大小限制为 2GB。 有关详细信息,请参阅 System.IO.Compression.ZipArchive。
注意
创建或更新存档文件时,Compress-Archive
cmdlet 将忽略隐藏的文件和文件夹。 在非 Windows 计算机上,这包括名称以句点(.
)字符开头的文件和文件夹。
若要确保隐藏的文件和文件夹压缩到存档中,请改用 .NET API。
一些示例使用旋转来减少代码示例的行长度。 有关详细信息,请参阅 about_Splatting。
示例
示例 1:压缩文件以创建存档文件
此示例压缩来自不同目录的文件并创建存档文件。 通配符用于获取具有特定文件扩展名的所有文件。 存档文件中没有目录结构,因为 路径 仅指定文件名。
$compress = @{
Path = "C:\Reference\Draftdoc.docx", "C:\Reference\Images\*.vsd"
CompressionLevel = "Fastest"
DestinationPath = "C:\Archives\Draft.zip"
}
Compress-Archive @compress
Path 参数接受具有通配符的特定文件名和文件名,*.vsd
。
路径 使用逗号分隔的列表从不同的目录获取文件。 压缩级别 最快 以减少处理时间。
DestinationPath 参数指定 Draft.zip
文件的位置。
Draft.zip
文件包含 Draftdoc.docx
以及扩展名为 .vsd
的所有文件。
示例 2:使用 LiteralPath 压缩文件
此示例压缩特定的命名文件并创建新的存档文件。 存档文件中没有目录结构,因为 路径 仅指定文件名。
$compress = @{
LiteralPath= "C:\Reference\Draft Doc.docx", "C:\Reference\Images\diagram2.vsd"
CompressionLevel = "Fastest"
DestinationPath = "C:\Archives\Draft.zip"
}
Compress-Archive @compress
使用绝对路径和文件名,因为 LiteralPath 参数不接受通配符。
路径 使用逗号分隔的列表从不同的目录获取文件。 压缩级别 最快 以减少处理时间。
DestinationPath 参数指定 Draft.zip
文件的位置。
Draft.zip
文件仅包含 Draftdoc.docx
和 diagram2.vsd
。
示例 3:压缩包含根目录的目录
此示例压缩目录并创建 包含根目录 及其所有文件和子目录的存档文件。 存档文件具有目录结构,因为 路径 指定根目录。
Compress-Archive -Path C:\Reference -DestinationPath C:\Archives\Draft.zip
Compress-Archive
使用 Path 参数指定根目录,C:\Reference
。
DestinationPath 参数指定存档文件的位置。
Draft.zip
存档包括 Reference
根目录及其所有文件和子目录。
示例 4:压缩排除根目录的目录
此示例压缩目录并创建一个存档文件,排除根目录,因为 路径 使用星号(*
)通配符。 存档包含一个目录结构,其中包含根目录的文件和子目录。
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:使用管道存档文件
此示例将文件发送到管道,以创建存档。 存档文件中没有目录结构,因为 路径 仅指定文件名。
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
创建 DirectoryInfo 对象,FileInfo 对象 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
该命令使用 C:\Reference
目录中现有文件的较新版本及其子目录中更新 Draft.zip
。 并且,已添加到 C:\Reference
或其子目录的新文件包含在更新的 Draft.zip
存档中。
参数
-CompressionLevel
指定创建存档文件时要应用的压缩量。 更快的压缩需要更少的时间来创建文件,但可能会导致更大的文件大小。
如果未指定此参数,该命令将使用默认值,最佳。
以下是此参数的可接受值:
- 最快。 使用可用的最快压缩方法来缩短处理时间。 更快的压缩可能导致更大的文件大小。
- 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
使用存档中找到的原始值。 这可能会导致文件名与存档中存储的源文件名不同。