Як знайти порожні каталоги в Windows за допомогою сценарію Powershell


8

Яку команду ви використовуєте для пошуку порожніх каталогів у Windows?

Деякі папки можуть містити деякі приховані папки, наприклад, .svnабо .settings, але вони все одно повинні розглядатися як порожні папки.


Яку версію Windows ви працюєте?
Windos

Відповіді:


13

Найпростіший спосіб, що я можу придумати, - це невеликий сценарій 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

я використовую Windows Vista
Джошуа

PowerShell для Vista можна завантажити тут: microsoft.com/download/en/details.aspx?id=23200
Windos

7
Примітка. Цей конвеєр знайде папки, які не містять файлів, але містять інші папки. Щоб мати повністю порожні папки, змініть третій елемент труби на ?{$_.GetFileSystemInfos().Count -eq 0}.
Річард

1
@Joshua, ви не змінили "C: \ Scripts" на те, де ви хочете шукати, отже, ви отримаєте помилку "Неможливо знайти шлях" C: \ Scripts ", оскільки його немає". Це прямо на початку рядка.
Windos

1
@Joshua, ти читав коментар Річардса (третій у цій темі) та мою редагування відповіді? Це має надавати вам лише каталоги без файлів і дочірніх каталогів (тобто вузли листя)
Windos

2

Далі - найпростіший спосіб, який я міг би досягти цього за допомогою одного рядка коду. У ньому перераховані порожні каталоги в поточному місці. Якщо потрібна рекурсія, -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


2

Спробуйте це

Get-ChildItem C:\Scripts -Recurse -Directory | Where-Object {!$_.GetFileSystemInfos().Count}

Кількість не дорівнює 0, вона взагалі не існує, що каталог повністю порожній або містить інші повністю порожні папки


1

Дякую, я використав це як основу для свого сценарію. Я хотів видалити порожні папки, але, намагаючись зробити, 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)
#>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.