วิธีค้นหาไดเรกทอรีว่างใน Windows โดยใช้ Powershell Script


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 \ ว่างเปล่า 
C: \ Scripts \ Empty โฟลเดอร์ 2 
C: \ Scripts \ Empty \ Empty โฟลเดอร์ย่อย 
C: \ Scripts \ New โฟลเดอร์ \ Empty โฟลเดอร์ย่อยสามระดับ

หากคุณมอง PowerShell สักหน่อยฉันแน่ใจว่าคุณจะสามารถหาวิธีลบโฟลเดอร์ที่ว่างโดยอัตโนมัติได้หากคุณต้องการ

แก้ไข : ตามที่ Richard กล่าวไว้ในความคิดเห็นสำหรับการใช้ไดเรกทอรีว่างเปล่าอย่างแท้จริง:

(gci C:\Scripts -r | ? {$_.PSIsContainer -eq $True}) | ?{$_.GetFileSystemInfos().Count -eq 0} | select FullName

กำลังใช้งาน Windows Vista
Joshua

PowerShell สำหรับ Vista สามารถดาวน์โหลดได้ที่นี่: microsoft.com/download/en/details.aspx?id=23200
Windos

7
หมายเหตุ: ไปป์ไลน์นั้นจะค้นหาโฟลเดอร์ที่ไม่มีไฟล์ แต่มีโฟลเดอร์อื่นอยู่ ?{$_.GetFileSystemInfos().Count -eq 0}ที่จะมีอย่างสมบูรณ์โฟลเดอร์ว่างเปลี่ยนองค์ประกอบที่สามของท่อ
ริชาร์ด

1
@ โจชัวคุณไม่ได้เปลี่ยน "C: \ Scripts" เป็นตำแหน่งที่คุณต้องการค้นหาดังนั้นคุณจึงได้รับข้อผิดพลาด "ไม่พบเส้นทาง 'C: \ Scripts' เนื่องจากไม่มีอยู่" มันอยู่ที่จุดเริ่มต้นของบรรทัด
Windos

1
@ โจชัว, คุณอ่านความคิดเห็นของริชาร์ด (ที่สามในหัวข้อนี้) และการแก้ไขคำตอบของฉัน? เท่านั้นที่จะช่วยให้คุณไดเรกทอรีที่มีไฟล์และไม่มีไดเรกทอรีเด็ก (เช่นโหนดใบ)
Windos

2

ต่อไปนี้เป็นวิธีที่ง่ายที่สุดที่ฉันสามารถทำได้โดยใช้โค้ดเพียงบรรทัดเดียว มันแสดงรายการไดเรกทอรีว่างเปล่าที่ตำแหน่งปัจจุบัน หากการเรียกซ้ำเป็นสิ่งจำเป็นพารามิเตอร์อาจจะเพิ่มการเรียกร้องให้-RecurseGet-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


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)
#>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.