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
。 不压缩源文件。
最佳
。 处理时间取决于文件大小。
-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\*.*
使用递归并在管道中发送对象可以复制存档中的文件。 例如,如果将
Get-ChildItem
与
Recurse
参数一起使用,则会将管道下发送的每个
FileInfo
和
DirectoryInfo
对象添加到存档中。
Compress-Archive
cmdlet 使用 UTF-8 编码。 其他 ZIP 存档工具可能使用不同的编码方案。 提取文件名未使用 UTF-8 编码存储的文件时,
Expand-Archive
使用存档中找到的原始值。 这可能会导致文件名与存档中存储的源文件名不同。
Expand-Archive
Get-ChildItem