Відповіді:
Найпростіший спосіб, що я можу придумати, - це невеликий сценарій PowerShell . Якщо у вас працює Windows 7, ви повинні мати її вже встановленою, якщо не відвідайте Microsoft.com, щоб завантажити та встановити її. Посилання містить детальний опис, але суть операції тут включена для зручності.
Відкрийте PowerShell і введіть це:
(gci C:\Scripts -r | ? {$_.PSIsContainer -eq $True}) | ? {$_.GetFiles().Count -eq 0} | select FullName
Змініть C: \ Сценарії на те, що ви хочете шукати, ви навіть можете встановити його лише на C: \, якщо ви хочете перевірити весь диск.
Це дасть вам такий вихід (зауважте, що це порожні каталоги нижче C: \ Scripts.
Повне ім'я ------- C: \ Сценарії \ Порожні C: \ Сценарії \ Порожня папка 2 C: \ Сценарії \ Порожні \ Порожня підпапка C: \ Сценарії \ Нова папка \ Порожня підпапка Три рівні глибокі
Якщо ви трохи заглянете в PowerShell, я впевнений, що ви зможете зрозуміти, як автоматично видалити порожні папки, якщо цього хочете (хоча я рекомендую проти цього, на всякий випадок.)
Редагувати : Як згадував Річард у коментарях, для справді порожнього каталогу використовуйте:
(gci C:\Scripts -r | ? {$_.PSIsContainer -eq $True}) | ?{$_.GetFileSystemInfos().Count -eq 0} | select FullName
?{$_.GetFileSystemInfos().Count -eq 0}
.
Далі - найпростіший спосіб, який я міг би досягти цього за допомогою одного рядка коду. У ньому перераховані порожні каталоги в поточному місці. Якщо потрібна рекурсія, -Recurse
до виклику може бути доданий параметр Get-ChildItem
.
Get-ChildItem -Directory | Where-Object { $_.GetFileSystemInfos().Count -eq 0 }
Коротка версія з псевдонімами:
dir -Directory | ? {$_.GetFileSystemInfos().Count -eq 0 }
Або як параметризовану функцію PowerShell (я додав це до мого профілю запуску PowerShell):
Function Get-EmptyDirectories($basedir) {
Get-ChildItem -Directory $basedir | Where-Object { $_.GetFileSystemInfos().Count -eq 0 }
}
Потім це може бути використане як будь-яка інша функція PowerShell, включаючи трубопроводи. Наприклад, цей виклик видалить усі порожні каталоги в системному каталозі temp:
Get-EmptyDirectories $env:TMP | del
Спробуйте це
Get-ChildItem C:\Scripts -Recurse -Directory | Where-Object {!$_.GetFileSystemInfos().Count}
Кількість не дорівнює 0, вона взагалі не існує, що каталог повністю порожній або містить інші повністю порожні папки
Дякую, я використав це як основу для свого сценарію. Я хотів видалити порожні папки, але, намагаючись зробити, Where-Object {$_.GetFiles().Count -eq 0}
було б видалити папки, які не мали порожніх підкаталогів. У кінцевому підсумку я використовую цикл DO WHILE, щоб видалити папку, у якій не було файлів чи папок, потім петлю назад і ще раз перевіряю, поки вона не дійшла до кінця дерева.
$Datefn=Get-Date -format M.d.yyyy_HH.mm.ss
#Set The File Name for the log file
$DelFileName = $Datefn
#Set The File Ext for the log file
$DelFileExt = " - Old Files" + ".log"
#Set The File Name With Ext for the log file
$DelFileName = $DelFileName + $DelFileExt
#Set Log Path
$LogPath = [Environment]::GetFolderPath("Desktop")
$Path = 'Q:\'
$NumDays = 365
Get-ChildItem -Path $Path -Exclude DCID.txt,*.exe -Recurse | Where-Object {$_.lastwritetime -lt`
(Get-Date).addDays(-$NumDays) -and $_.psiscontainer -eq $false} |
ForEach-Object {
$properties = @{`
Path = $_.Directory`
Name = $_.Name
DateModified = $_.LastWriteTime
Size = $_.Length / 1GB }
New-Object PSObject -Property $properties | select Path,Name,DateModified, Size
} |
Out-File "$LogPath\$DelFileName"
<#
#Removes the files found
Get-ChildItem -Path $Path -Exclude DCID.txt,*.exe -Recurse | Where-Object {$_.lastwritetime -lt`
(Get-Date).addDays(-365) -and $_.psiscontainer -eq $false} | Remove-Item -Recurse -Force
#Removes empty folders
DO {
$a = (Get-ChildItem $Path -Recurse | Where-Object {$_.PSIsContainer -eq $true}) | Where-Object`
{$_.GetFileSystemInfos().Count -eq 0} | Select-Object Fullname
$a
(Get-ChildItem $Path -Recurse | Where-Object {$_.PSIsContainer -eq $true}) | Where-Object`
{$_.GetFileSystemInfos().Count -eq 0} | Remove-Item -Force
}
WHILE ($a -ne $null)
#>