Как найти пустые каталоги в 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: \ Scripts на то, что вы хотите найти, вы даже можете установить его на C: \, если хотите, чтобы он проверял весь диск.

Это даст вам такой вывод (обратите внимание, что это пустые каталоги ниже C: \ Scripts.

Полное имя
------- 
C: \ Scripts \ Empty 
C: \ Scripts \ Пустая папка 2 
C: \ Scripts \ Empty \ Пустая подпапка 
C: \ Scripts \ Новая папка \ Пустая подпапка на три уровня

Если вы немного загляните в PowerShell, я уверен, что вы сможете понять, как автоматически удалять пустые папки, если хотите (хотя я рекомендую против, на всякий случай).

Изменить : как Ричард упомянул в комментариях, для действительно пустой директории использовать:

(gci C:\Scripts -r | ? {$_.PSIsContainer -eq $True}) | ?{$_.GetFileSystemInfos().Count -eq 0} | select FullName
Windos
источник
я использую Windows Vista
Джошуа
PowerShell для Vista можно скачать здесь: microsoft.com/download/en/details.aspx?id=23200
Windos
7
Примечание: этот конвейер найдет папки, которые не содержат файлов, но содержат другие папки. Чтобы полностью пустые папки изменили третий элемент канала на ?{$_.GetFileSystemInfos().Count -eq 0}.
Ричард
1
@ Джошуа, вы не изменили «C: \ Scripts» на то место, где хотите искать, поэтому вы получаете ошибку «Не удается найти путь« C: \ Scripts », потому что он не существует». Это прямо в начале строки.
Windos
1
@ Джошуа, ты прочитал комментарий Ричардса (третий в этой теме) и мое редактирование к ответу? Это должно дать вам только каталоги без файлов и дочерних каталогов (т.е.
конечных
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, включая конвейерную передачу. Например, этот вызов удалит все пустые каталоги в системном временном каталоге:

Get-EmptyDirectories $env:TMP | del

ESO
источник
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)
#>
Майкл
источник