Powershell 查找给定文件夹名称中的所有空文件夹和子文件夹

Powershell Find all empty folders and subfolders in a given Folder name

我正在尝试获取 a) 如果文件夹名为“Archiv”,则列出所有空文件夹和子文件夹 b) 我想删除所有这些空文件夹。我目前的做法不检查子文件夹。

如果结果能以 .csv 格式导出就好了 =)

$TopDir = 'C:\Users\User\Test'

$DirToFind = 'Archiv'>$EmptyDirList = @(
    Get-ChildItem -LiteralPath $TopDir -Directory -Recurse |
        Where-Object {
            #[System.IO.Directory]::GetFileSystemEntries($_.FullName).Count -eq 0
            $_.GetFileSystemInfos().Count -eq 0 -and
            $_.Name -match $DirToFind
            }
        ).FullName

$EmptyDirList

有什么办法可以调整代码吗?提前致谢

不确定是否需要 CSV,我认为一个简单的文本文件就足够了,因为它只是一个列表。 无论如何,这是(虽然不是最优雅的)解决方案,它也将删除“嵌套的空目录”。这意味着如果一个目录只包含空的 directorIS,它也会被删除

$TopDir = "C:\Test" #Top level directory to scan
$EmptyDirListReport = "C:\EmptyDirList.txt" #Text file location to store a file with the list of deleted directorues
if (Test-Path -Path $EmptyDirListReport -PathType Leaf)
{
    Remove-Item -Path $EmptyDirListReport -Force
}
$EmptyDirList = ""
Do
{
    $EmptyDirList = Get-ChildItem -Path $TopDir -Recurse | Where-Object -FilterScript { $_.PSIsContainer } | Where-Object -FilterScript { ((Get-ChildItem -Path $_.FullName).Count -eq 0) } | Select-Object -ExpandProperty FullName
    if ($EmptyDirList)
    {
        $EmptyDirList | Out-File -FilePath $EmptyDirListReport -Append
        $EmptyDirList | Remove-Item -Force
    }
} while ($EmptyDirList)

这应该可以解决问题,也应该适用于嵌套。

$result=(Get-ChildItem -Filter "Archiv" -Recurse -Directory  $topdir | Sort-Object @{Expression = {$_.FullName.Length}} -Descending | ForEach-Object {
     if ((Get-ChildItem -Attributes d,h,a $_.fullname).count -eq 0){
         $_
         rmdir $_.FullName
      } 
})
$result | select Fullname |ConvertTo-Csv |Out-File $Logfile

您需要颠倒 Get-ChildItem 列出项目的顺序,以便您可以首先使用嵌套最深的空文件夹进行删除。

$LogFile = 'C:\Users\User\RemovedEmptyFolders.log'
$TopDir  = 'C:\Users\User\Test'

# first get a list of all folders below the $TopDir directory that are named 'Archiv' (FullNames only)
$archiveDirs = (Get-ChildItem -LiteralPath $TopDir -Filter 'Archiv' -Recurse -Directory -Force).FullName | 
                # sort on the FullName.Length property in Descending order to get 'deepest-nesting-first' 
                Sort-Object -Property Length -Descending 

# next, remove all empty subfolders in each of the $archiveDirs
$removed = foreach ($dir in $archiveDirs) {
    (Get-ChildItem -LiteralPath $dir -Directory -Force) |
    # sort on the FullName.Length property in Descending order to get 'deepest-nesting-first' 
    Sort-Object @{Expression = {$_.FullName.Length}} -Descending | 
    ForEach-Object {
       # if this folder is empty, remove it and output its FullName for the log
       if (@($_.GetFileSystemInfos()).Count -eq 0) { 
           $_.FullName
           Remove-Item -LiteralPath $_.FullName -Force
       }
    }
    # next remove the 'Archiv' folder that is now possibly empty too
    if (@(Get-ChildItem -LiteralPath $dir -Force).Count -eq 0) {
        # output this folders fullname and delete
        $dir
        Remove-Item -LiteralPath $dir -Force
    }
}

$removed | Set-Content -Path $LogFile -PassThru  # write your log file. -PassThru also writes the output on screen

你可以用一条线来做到这一点:

> Get-ChildItem -Recurse dir -filter Archiv | 
    Where-Object {($_ | Get-ChildItem).count -eq 0} | 
      Remove-Item

尽管出于某种原因,如果您嵌套了 Archiv 文件,例如 Archiv/Archiv,您需要多次 运行 该行。