gpt4 book ai didi

windows - 从 powershell 递归归档某种类型的所有文件

转载 作者:可可西里 更新时间:2023-11-01 11:43:39 29 4
gpt4 key购买 nike

有没有一种方法可以使用 Compress-Archive 脚本,当从路径运行时:

  1. 归档所有匹配通配符过滤器的文件(例如 *.doc)
  2. 将此类文件归档到当前文件夹和所有子文件夹中
  3. 保存相对文件夹结构(不过,使用相对或绝对选项会更好)

我很难同时完成所有这三个。

编辑:

以下过滤器和递归,但不维护文件夹结构

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"

在某些时候,我有一个会递归但不会过滤的命令,但现在无法返回。

最佳答案

不幸的是,从 Windows PowerShell v5.1/PowerShell Core 6.1.0 开始,Compress-Archive 非常有限:

  • 保留子目录树的唯一方法是将目录路径传递给Compress-Archive

    • 不幸的是,这样做没有包含/排除机制,只能选择文件的一个子集。

    • 此外,生成的存档将在内部包含一个以输入目录命名的根目录(例如,如果您将 C:\temp\foo 传递给Compress-Archive,生成的存档将包含一个包含输入目录子树的 foo 目录 - 而不是包含 C:\temp\foo内容在顶层)。

    • 没有保留绝对路径的选项。

  • 一个麻烦的解决方法是创建目录树的临时副本只包含感兴趣的文件(Copy-Item -Recurse - Filter *.docx . $env:TEMP\tmpDir; Compress-Archive $env:TEMP\tmpDir out.zip - 注意 empty 目录将被包括在内)

    • 鉴于您最终仍会不可避免地得到一个以存档内的输入目录命名的根目录,即使这样也可能对您不起作用 - 请参阅底部的备选方案。

使用替代品可能会更好:


直接使用.NET v4.5+解决问题[System.IO.Compression.ZipFile]类:

注意:

  • 在 Windows PowerShell 中,与 PowerShell Core 不同,您大多数情况下使用 Add-Type -AssemblyName System.IO.Compression.FileSystem 手动加载相关程序集。

  • 因为从 Windows PowerShell v5.1/PowerShell Core 6.1.0 开始,PowerShell 不支持隐式使用扩展方法,您必须显式使用 [System.IO.Compression.ZipFileExtensions]类也是。

# Windows PowerShell: must load assembly System.IO.Compression.FileSystem manually.
Add-Type -AssemblyName System.IO.Compression.FileSystem

# 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()

关于windows - 从 powershell 递归归档某种类型的所有文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52344911/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com