Cách tìm các thư mục trống trong Windows bằng Powershell Script


8

Lệnh nào bạn sử dụng để tìm các thư mục trống trong Windows?

Một số thư mục có thể chứa một số thư mục ẩn như .svnhoặc .settings, nhưng chúng vẫn nên được coi là thư mục trống.


Phiên bản Windows nào bạn đang chạy?
Windos

Câu trả lời:


13

Cách dễ nhất tôi có thể nghĩ là với một tập lệnh PowerShell nhỏ . Nếu bạn đang chạy Windows 7, bạn nên cài đặt nó, nếu không truy cập Microsoft.com để tải xuống và cài đặt nó. Liên kết cung cấp một mô tả chi tiết nhưng ý chính của hoạt động được bao gồm ở đây để thuận tiện cho bạn.

Mở PowerShell và nhập này:

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

Thay đổi C: \ Script thành bất cứ thứ gì bạn muốn tìm kiếm, thậm chí bạn có thể đặt nó thành C: \ nếu bạn muốn nó kiểm tra toàn bộ ổ đĩa.

Nó sẽ cung cấp cho bạn đầu ra như thế này (lưu ý đây là các thư mục trống bên dưới C: \ Sc scripts.

Họ và tên
------- 
C: \ ScScript \ Empty 
C: \ Sc scripts \ Thư mục trống 2 
C: \ Sc scripts \ Empty \ Empty Subfolder 
C: \ Sc scripts \ Thư mục mới \ Thư mục con rỗng ba cấp độ sâu

Nếu bạn xem xét PowerShell một chút, tôi chắc chắn bạn sẽ có thể tìm ra cách tự động xóa các thư mục trống nếu bạn muốn (mặc dù tôi khuyên bạn nên chống lại nó, chỉ trong trường hợp.)

Chỉnh sửa : Như Richard đã đề cập trong các bình luận, để sử dụng thư mục thực sự trống:

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

đang sử dụng Windows Vista
Joshua

Có thể tải xuống PowerShell cho Vista tại đây: microsoft.com/doad/en/details.aspx?id=23200
Windos

7
Lưu ý: đường ống đó sẽ tìm các thư mục không chứa tệp nhưng có chứa các thư mục khác. Để có các thư mục hoàn toàn trống, thay đổi thành phần thứ ba của đường ống thành ?{$_.GetFileSystemInfos().Count -eq 0}.
Richard

1
@Joshua, bạn đã không thay đổi "C: \ ScScript" thành nơi bạn muốn tìm kiếm, do đó bạn gặp lỗi "Không thể tìm thấy đường dẫn 'C: \ Sc scripts' vì nó không tồn tại." Nó ở ngay đầu dòng.
Windos

1
@Joshua, bạn đã đọc bình luận của Richards (phần thứ ba trong chủ đề này) và bản chỉnh sửa của tôi cho câu trả lời chưa? Điều đó sẽ chỉ cung cấp cho bạn các thư mục không có tệp và không có thư mục con (tức là các nút lá)
Windos

2

Sau đây là cách dễ nhất tôi có thể tìm thấy để đạt được điều này với một dòng mã. Nó liệt kê các thư mục trống tại vị trí hiện tại. Nếu đệ quy là cần thiết, tham số -Recursecó thể được thêm vào cuộc gọi đến Get-ChildItem.

Get-ChildItem -Directory | Where-Object { $_.GetFileSystemInfos().Count -eq 0 }

Phiên bản ngắn với bí danh:

dir -Directory | ? {$_.GetFileSystemInfos().Count -eq 0 }

Hoặc, như một chức năng PowerShell được tham số hóa (tôi đã thêm phần này vào hồ sơ khởi động PowerShell của mình):

Function Get-EmptyDirectories($basedir) { 
    Get-ChildItem -Directory $basedir | Where-Object { $_.GetFileSystemInfos().Count -eq 0 }
}

Điều này sau đó có thể được gọi như bất kỳ chức năng PowerShell nào khác, bao gồm cả đường ống. Ví dụ: cuộc gọi này sẽ xóa tất cả các thư mục trống trong thư mục temp hệ thống:

Get-EmptyDirectories $env:TMP | del


2

Thử cái này

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

Số lượng không phải là 0, nó hoàn toàn không tồn tại có nghĩa là thư mục hoàn toàn trống hoặc chứa các thư mục hoàn toàn trống khác


1

Cảm ơn, tôi đã sử dụng điều này như là một cơ sở cho kịch bản của tôi. Tôi muốn xóa các thư mục trống nhưng cố gắng làm Where-Object {$_.GetFiles().Count -eq 0}sẽ xóa các thư mục có thư mục con không trống. Tôi đã kết thúc bằng cách sử dụng vòng lặp DO WHILE để xóa thư mục không có tệp hoặc thư mục sau đó lặp lại và kiểm tra lại cho đến khi đến cuối cây.

$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)
#>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.