Перечислите (а затем удалите) все папки без файлов - PullRequest
0 голосов
/ 22 октября 2019

Я хотел бы найти все папки по определенному пути (C: \ main_folder), в которых нет файлов.

Я нашел способ с помощью cmd:

@echo off
setlocal
set "folder=C:\main_folder"
for /r "%folder%" /d %%F in (.) do dir /b "%%F" | findstr "^" >nul || (echo %%~fF) > "C:\empty_folders_list.txt" 

но если у меня есть
C:\main_folder\folder_1, содержащий folder_2 и без файлов, и
C:\main_folder\folder_1\folder_2 без файлов, этот код выдаст только
C:\main_folder\folder_1\folder_2, в то время как я хотел быиметь также C:\main_folder\folder_1.

Он не должен смотреть только на папки, в которых нет файлов, потому что я могу иметь C:\main_folder\folder_3, содержащий folder_4 и без файлов, но если C:\main_folder\folder_3\folder_4 содержит файл, folder_3 и folder_4 не должны быть в списке.

И после получения списка я хочу удалить их (список предназначен только для проверки / сохранения их).

Как сделатьЯ это пишу? Спасибо!

1 Ответ

0 голосов
/ 22 октября 2019

Если вы поддерживаемая система Windows, она будет иметь PowerShell. Это требует PowerShell 3.0+, но может быть сделано с 2.0 с некоторыми модификациями.

Это собирает список подкаталогов и сортирует имена по убыванию. Это делается для того, чтобы пустой каталог с пустыми подкаталогами был удален.

Если вы уверены, что правильные каталоги будут удалены, удалите -WhatIf из команды Remove-Item.

=== Remove-Empties.ps1

$baseDir = 'C:\main_folder'
$dirs = (Get-ChildItem -Directory -Recurse -Path $baseDir).FullName | Sort-Object -Descending
foreach ($dir in $dirs) {
    if (((Get-ChildItem -Directory -Path $dir).Length -eq 0) -and
        ((Get-ChildItem -File -Path $dir | Measure-Object).Count -eq 0)) {
        "Removing directory $($dir)"
        Remove-Item -Path $dir -WhatIf
    }
}

=== Вызов из командной строки cmd.exe или сценария .bat файла

powershell -NoLogo -NoProfile -File ".\Remove-Empties.ps1" >"C:\empty_folders_list.txt"
...