如何使用PowerShell根据上次修改日期删除特定目录中的文件和父文件夹?

rqcrx0a6  于 2023-06-23  发布在  Shell
关注(0)|答案(1)|浏览(158)

我想创建powershell脚本来删除文件和文件夹与此方案:

  • 解析所有项目的格式为E:\Data\Report
  • 在报告文件夹中,我有很多文件夹,如“1578”,“1579”,“1576”等。
  • 每个文件夹都有许多文件
  • 我的脚本必须读取每一个文件夹和子文件夹和罚款文件,最后修改是高达30j
  • 然后删除文件
  • 然后删除父文件夹"1578"如果它是空的
  • 等等

但我卡住了,因为我找不到如何返回到父文件夹。
这是我的剧本,你能帮我吗?

$folderPath = "E:\Data\Report"
$limit = (Get-Date).AddDays(-30)

Get-ChildItem -Path $folderPath -Directory | Where-Object { $_.LastWriteTime -lt $limit } | Remove-Item -Recurse -Force

我的代码粘贴在这里只删除文件,但不父文件夹
我的主文件夹是GLASSART,我的脚本需要解析每个子文件夹(209580,209581,209582等),每个子文件夹都有文件和子文件夹

xzlaal3s

xzlaal3s1#

注意:根据后来的反馈和对您问题的更新,您似乎正在寻找下面的用例2。

用例一:如果$folderPath子文件夹中只有个文件**(且没有自己的子文件夹):

$folderPath = "E:\Data\Report"
$limit = (Get-Date).AddDays(-30)

Get-ChildItem -LiteralPath $folderPath -Directory | 
  ForEach-Object {
    # Determine which files inside the folder at hand should be deleted, 
    # and which should be kept.
    $toDelete, $toKeep = 
      ($_ | Get-ChildItem -File -Force).
      Where({ $_.LastWriteTime -lt $limit }, 'Split')
    # No files to keep? Delete the folder at hand as a whole.
    if (-not $toKeep) { 
      $_ | Remove-Item -Recurse -Force -WhatIf
    } 
    # Should a subset of the files be deleted?
    elseif ($toDelete) {
      $toDelete | Remove-Item -Force -WhatIf
    }
    # Otherwise: no files to delete.
  }

注意:上面命令中的-WhatIf公共参数 * 预览 * 操作。删除-WhatIf,并在确定该操作将按您的要求执行后重新执行。

用例二:如果文件太旧,且子文件夹为空,则必须从每个子文件夹的整个子树中删除。

注意事项:

  • 为了安全起见,-WhatIf在下面的第一个Remove-Item调用中保留了下来。但是,这意味着解决方案的 folder-deletion方面不能预览,因为只有在文件和子文件夹实际被删除时,逻辑才会启动。换句话说:你只能预览哪些 * 文件 * 将被删除。
  • 通过在folder-deletion Remove-Item调用中 not 使用-WhatIf,任何 * 已经为空 * 的子目录将立即被删除。
$folderPath = "E:\Data\Report"
$limit = (Get-Date).AddDays(-30)

Get-ChildItem -LiteralPath $folderPath -Directory | 
  ForEach-Object {

    # Step 1: In the entire *subtree* of the subfolder at hand,
    #         delete all too-old files.
    $_ | Get-ChildItem -Recurse -File -Force | 
        Where-Object LastWriteTime -lt $limit |
        Remove-Item -Force -WhatIf

    # Step 2: Examine all folders in the subtree, including the subfolder at hand,
    #         starting at the lowest level, 
    #         and iteratively delete any (now) empty folders.
    & { $_; $_ | Get-ChildItem -Recurse -Directory -Force } |
        Sort-Object -Descending { ($_.FullName -split '[\\/]').Count } |
        ForEach-Object {
          # Is this folder (now) empty?
          if (-not ($_ | Get-ChildItem -Force | Select-Object -First 1)) {
            $_ | Remove-Item # Remove this folder
          }
        }
  }

相关问题