Cara menemukan direktori kosong di Windows menggunakan Skrip Powershell


8

Perintah apa yang Anda gunakan untuk menemukan direktori kosong di Windows?

Beberapa folder mungkin berisi beberapa folder tersembunyi seperti .svnatau .settings, tetapi folder tersebut masih harus diperlakukan sebagai folder kosong.


Versi Windows apa yang Anda jalankan?
Windos

Jawaban:


13

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

Saya menggunakan Windows Vista
Joshua

PowerShell untuk Vista dapat diunduh di sini: microsoft.com/download/en/details.aspx?id=23200
Windos

7
Catatan: pipeline itu akan menemukan folder yang tidak mengandung file tetapi mengandung folder lain. Agar folder benar-benar kosong ubah elemen ketiga pipa menjadi ?{$_.GetFileSystemInfos().Count -eq 0}.
Richard

1
@Joshua, Anda tidak mengubah "C: \ Scripts" ke tempat Anda ingin mencari, maka Anda mendapatkan kesalahan "Tidak dapat menemukan jalur 'C: \ Scripts' karena tidak ada." Itu tepat di awal baris.
Windos

1
@ Joshua, sudahkah Anda membaca komentar Richards (yang ketiga di utas ini) dan hasil edit saya untuk jawabannya? Itu seharusnya hanya memberi Anda direktori tanpa file dan direktori anak (yaitu node daun)
Windos

2

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 -Recursedapat 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


2

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


1

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)
#>
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.