有没有一种方法可以使用Compress-Archive脚本,当它从路径运行时:
我很难一次完成所有这三个操作。
编辑:
以下过滤器和递归程序,但不维护文件夹结构
Get-ChildItem -Path ".\" -Filter "*.docx" -Recurse |
Compress-Archive -CompressionLevel Optimal -DestinationPath "$pwd\doc.archive-$(Get-Date -f yyyyMMdd.hhmmss).zip"
该项目不会递归:
Compress-Archive -Path "$pwd\*.docx" -CompressionLevel Optimal -DestinationPath "$pwd\doc.archive-$(Get-Date -f yyyyMMdd.hhmmss).zip"
在某个时候,我有一个可以递归但不能过滤的命令,但是现在无法恢复。
答案 0 :(得分:2)
不幸的是,从Windows PowerShell v5.1 / PowerShell Core 6.1.0开始, Compress-Archive
受到了很大的限制:
保留子目录树的唯一方法是将目录路径传递到Compress-Archive
。
不幸的是,这样做提供了不包含/排除机制,只能选择一部分文件。
此外,生成的存档将在内部包含作为输入目录命名的单个根目录(例如,如果将C:\temp\foo
传递给Compress-Archive
,则生成的存档存档将只包含一个包含输入目录子树的foo
目录-与顶层包含C:\temp\foo
的 content 相对。)
没有保留绝对路径的选项。
一个麻烦的解决方法是仅用感兴趣的文件创建目录树的临时副本(Copy-Item -Recurse -Filter *.docx . $env:TEMP\tmpDir; Compress-Archive $env:TEMP\tmpDir out.zip
-请注意,< em> empty dirs。将包含在内)
使用替代品可能会更好:
直接使用.NET v4.5 + [System.IO.Compression.ZipFile]
和[System.IO.Compression.ZipFileExtensions]
类型。
在Windows PowerShell中,与在PowerShell Core 中不同,您最容易使用Add-Type -AssemblyName System.IO.Compression
手动加载相关程序集-参见下文。
使用外部程序,例如7-Zip
[System.IO.Compression.ZipFile]
类的问题:注意:
在Windows PowerShell中,与在PowerShell Core 中不同,大多数情况下,您使用Add-Type -AssemblyName System.IO.Compression
手动加载相关程序集。
由于PowerShell从Windows PowerShell v5.1 / PowerShell Core 6.1.0开始不支持隐式使用扩展方法,因此必须显式使用[System.IO.Compression.ZipFileExtensions]
课。
# Windows PowerShell: must load assembly System.IO.Compression manually.
Add-Type -AssemblyName System.IO.Compression
# Create the target archive via .NET to provide more control over how files
# are added.
# Make sure that the target file doesn't already exist.
$archive = [System.IO.Compression.ZipFile]::Open(
"$pwd\doc.archive-$(Get-Date -f yyyyMMdd.hhmmss).zip",
'Create'
)
# Get the list of files to archive with their relative paths and
# add them to the target archive one by one.
$useAbsolutePaths = $False # Set this to true to use absolute paths instead.
Get-ChildItem -Recurse -Filter *.docx | ForEach-Object {
# Determine the entry path, i.e., the archive-internal path.
$entryPath = (
($_.FullName -replace ([regex]::Escape($PWD.ProviderPath) + '[/\\]'), ''),
$_.FullName
)[$useAbsolutePaths]
$null = [System.IO.Compression.ZipFileExtensions]::CreateEntryFromFile(
$archive,
$_.FullName,
$entryPath
)
}
# Close the archive.
$archive.Dispose()