如何使用PowerShell删除空子文件夹?

Scr*_*her 28 powershell recursion file delete-directory

我有一个分享,是最终用户的"垃圾抽屉".他们可以根据需要创建文件夹和子文件夹.我需要实现一个脚本来删除超过31天创建的文件.

我从Powershell开始.我需要通过删除现在为空的子文件夹来跟进文件删除脚本.由于子文件夹的嵌套,我需要避免删除没有文件的子文件夹,但在其下面有一个包含文件的子文件夹.

例如:

  • FILE3a已经10天了. FILE3是45天.
  • 我想清理删除超过30天的文件的结构,并删除空的子文件夹.
C:\Junk\subfolder1a\subfolder2a\FILE3a

C:\Junk\subfolder1a\subfolder2a\subfolder3a

C:\Junk\subfolder1a\subfolder2B\FILE3b
Run Code Online (Sandbox Code Playgroud)

期望的结果:

  • 删除:FILE3b,subfolder2B&subfolder3a.
  • 离开:subfolder1a,subfolder2a,和FILE3a.

我可以递归清理文件.如何清除子文件夹而不删除subfolder1a?("垃圾"文件夹将始终保留.)

Kei*_*ill 43

我会在两次传递中执行此操作 - 首先删除旧文件,然后删除空目录:

Get-ChildItem -recurse | Where {!$_.PSIsContainer -and `
$_.LastWriteTime -lt (get-date).AddDays(-31)} | Remove-Item -whatif

Get-ChildItem -recurse | Where {$_.PSIsContainer -and `
@(Get-ChildItem -Lit $_.Fullname -r | Where {!$_.PSIsContainer}).Length -eq 0} |
Remove-Item -recurse -whatif
Run Code Online (Sandbox Code Playgroud)

这种类型的操作演示了第二组命令演示的PowerShell中嵌套管道的强大功能.它使用嵌套管道以递归方式确定任何目录下是否有零文件.

  • @(<这里的一些命令,包括流水线命令>)语法确保无论我们是否得到结果($ null)或单个结果或结果数组 - 使用@()*的内部可见结果将始终是一个包含0,1或N个项目的数组.这就是我确定结果将具有Length属性并且Length属性用于数组的方式(而不是字符串,如果结果是单个字符串值,则可能返回该字符串).像这样的动态语言可以非常强大,但它们会让你思考.:-) (3认同)

Bog*_*mac 9

本着第一个答案的精神,这是删除空目录的最短方法:

ls -recurse | where {!@(ls -force $_.fullname)} | rm -whatif
Run Code Online (Sandbox Code Playgroud)

当目录具有隐藏文件夹(如.svn)时,需要-force标志

  • 它不会删除嵌套的空目录,您有解决方法吗? (2认同)

Dou*_*urn 5

这将在解决空嵌套目录问题的父目录之前对子目录进行排序。

dir -Directory -Recurse |
    %{ $_.FullName} |
    sort -Descending |
    where { !@(ls -force $_) } |
    rm -WhatIf
Run Code Online (Sandbox Code Playgroud)