【问题标题】:Archive files older than 6 months存档超过 6 个月的文件
【发布时间】:2022-01-26 09:09:23
【问题描述】:

文件夹 X 有很多子文件夹 A、B、C、D... 每个子文件夹都有很多文件,我想归档这些子文件夹中所有超过 6 个月的文件。之后检查是否创建了存档并删除已存档的文件。

这是我尝试过的:

#$SourceFolder = "C:\Users\sec\Desktop\X"

ForEach-Object 
{
    Get-ChildItem -Path "$($_.FullName)" -Exclude "*.zip"
    Where-Object {($_.LastWriteTime -lt (Get-Date).AddMonths(-6))} |
        Compress-Archive -DestinationPath "$($_.FullName)\06.2020andOlder.zip" -Update;

    if (Test-Path 06.2020andOlder.zip) {
        Remove-Item -Force
    }
}

【问题讨论】:

  • 应该每个子文件夹都有自己的06.2020andOlder.zip 存档,还是要将所有内容存储在一个更大的 zip 文件中?
  • 每个文件夹都应该有自己的 zip,因为在每个文件夹中我都有不同机器的日志,如果有一天我想查找它们会更容易找到。
  • 这是我的假设,但不是太清楚。请在下面查看我的回答。
  • 如果您存储每个文件的相对路径,它仍然很容易找到,并且您可以使用更少的 zip 文件和稍微更好的压缩。试试我的解决方案here,看看它是否适合您的需求。

标签: powershell file archive


【解决方案1】:

假设您希望每个子文件夹都以 .zip 存档结尾,其中包含旧文件,请尝试以下操作:

使用Group-Object 将同一子目录中的所有旧文件组合在一起,并使用它来创建 .zip 文件并在压缩后删除原始文件。

$SourceFolder = 'D:\Test'
$refDate      = (Get-Date).AddMonths(-6).Date  # take this from midnight

Get-ChildItem -Path $SourceFolder -File -Recurse -Exclude "*.zip" | 
    Where-Object { $_.LastWriteTime -lt $refDate } |
    Group-Object DirectoryName | ForEach-Object {
        # construct the target folder path for the zip file using the Name of each group
        $zip = Join-Path -Path $_.Name -ChildPath '06.2020andOlder.zip'
        # archive all files in the group
        Compress-Archive -Path $_.Group.FullName -DestinationPath $zip -Update

        # here is where you can delete the original files after zipping
        $_.Group | Remove-Item -WhatIf
    }

请注意,我已将开关 -WhatIf 添加到 Remove-Item cmdlet。这是一个安全开关,因此您实际上还没有删除任何内容。该 cmdlet 现在只显示 删除的内容。一旦您对此输出感到满意,请移除 -WhatIf 开关,以便删除文件。

【讨论】:

  • 工作非常好。非常感谢西奥!!
  • Theo,是否可以使用您在文件夹中找到的所有内容创建存档,无论是文件还是文件夹都没有关系? (此时,如果在文件夹“A”中找到另一个文件夹“A1”,则脚本在 A 中创建 1 个 zip,在 A1 中创建 1 个 zip;在文件夹“A”中仅创建 1 个存档并包含文件夹 A1。
  • @Bogdan 我不会尝试这样做,因为 [1] 您希望它在什么级别的子目录开始收集? [2] 您可能会冒 zip 文件中的文件命名冲突的风险,这意味着子文件夹 A1\A2\A624 中的文件可能会覆盖父目录中的同名文件。
  • @Theo 命名冲突会最小化,如果您使用它们的相对路径存储文件。 Compress-Archive 不容易支持这一点,但 System.IO.Compression.FileSystem API 支持。 @Bogdan 您可以存储与文件关联的文件夹结构,但空文件夹不会存储在 zip 中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-31
  • 2020-01-29
  • 2020-03-15
  • 2015-05-21
  • 2014-12-08
  • 1970-01-01
相关资源
最近更新 更多