Jawaban:
Cara termudah yang bisa saya pikirkan adalah dengan skrip PowerShell kecil . Jika Anda menjalankan Windows 7 Anda harus sudah menginstalnya, jika tidak mengunjungi Microsoft.com untuk mengunduh dan menginstalnya. Tautan ini memberikan deskripsi terperinci, tetapi inti operasi disertakan di sini untuk kenyamanan Anda.
Buka PowerShell dan masukkan ini:
(gci C:\Scripts -r | ? {$_.PSIsContainer -eq $True}) | ? {$_.GetFiles().Count -eq 0} | select FullName
Ubah C: \ Script menjadi apa pun yang ingin Anda cari, Anda bahkan dapat mengaturnya menjadi hanya C: \ jika Anda ingin memeriksa seluruh drive.
Ini akan memberi Anda output seperti ini (perhatikan ini adalah direktori kosong di bawah C: \ Script.
Nama lengkap ------- C: \ Scripts \ Empty C: \ Scripts \ Folder Kosong 2 C: \ Scripts \ Empty \ Empty Subfolder C: \ Scripts \ Folder Baru \ Kosong Subfolder Tiga Tingkat Dalam
Jika Anda melihat PowerShell sedikit, saya yakin Anda akan dapat mengetahui cara menghapus folder kosong secara otomatis jika Anda mau (meskipun saya sarankan menentangnya, untuk berjaga-jaga.)
Sunting : Seperti yang disebutkan Richard dalam komentar, untuk penggunaan direktori yang benar-benar kosong:
(gci C:\Scripts -r | ? {$_.PSIsContainer -eq $True}) | ?{$_.GetFileSystemInfos().Count -eq 0} | select FullName
?{$_.GetFileSystemInfos().Count -eq 0}
.
Berikut ini adalah cara termudah yang dapat saya temukan untuk mencapainya dengan satu baris kode. Ini daftar direktori kosong di lokasi saat ini. Jika rekursi diperlukan, parameter -Recurse
dapat ditambahkan ke panggilan Get-ChildItem
.
Get-ChildItem -Directory | Where-Object { $_.GetFileSystemInfos().Count -eq 0 }
Versi singkat dengan alias:
dir -Directory | ? {$_.GetFileSystemInfos().Count -eq 0 }
Atau, sebagai fungsi PowerShell yang diparameterisasi (saya menambahkan ini ke profil startup PowerShell saya):
Function Get-EmptyDirectories($basedir) {
Get-ChildItem -Directory $basedir | Where-Object { $_.GetFileSystemInfos().Count -eq 0 }
}
Ini kemudian dapat dipanggil sebagai fungsi PowerShell lainnya, termasuk pemipaan. Misalnya, panggilan ini akan menghapus semua direktori kosong di direktori temp sistem:
Get-EmptyDirectories $env:TMP | del
Coba ini
Get-ChildItem C:\Scripts -Recurse -Directory | Where-Object {!$_.GetFileSystemInfos().Count}
Hitungannya bukan 0, tidak ada artinya sama sekali bahwa direktori tersebut benar-benar kosong atau menampung folder lain yang benar-benar kosong
Terima kasih, saya menggunakan ini sebagai dasar untuk skrip saya. Saya ingin menghapus folder kosong tetapi coba lakukan Where-Object {$_.GetFiles().Count -eq 0}
akan menghapus folder yang memiliki sub-direktori yang tidak kosong. Saya akhirnya menggunakan loop DO WHILE untuk menghapus folder yang tidak memiliki file atau folder kemudian loop kembali dan periksa lagi sampai mencapai ujung pohon.
$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)
#>