Powershellスクリプトを使用してWindowsで空のディレクトリを見つける方法


8

Windowsで空のディレクトリを見つけるには、どのコマンドを使用しますか?

一部のフォルダには、.svnまたはのようないくつかの隠しフォルダが含まれている可能性があります.settingsが、それらは空のフォルダとして扱われる必要があります。


実行しているWindowsのバージョンは何ですか?
ウィンドス

回答:


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 \ Empty Folder 2 
C:\ Scripts \ Empty \ Emptyサブフォルダー 
C:\ Scripts \ New Folder \ Empty Subfolder Three Levels Deep

PowerShellを少し調べれば、必要に応じて空のフォルダーを自動的に削除する方法を理解できると思います(念のため、これはお勧めしません)。

編集:リチャードがコメントで述べたように、本当に空のディレクトリを使用するには:

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

Windows Vistaを使用しています
Joshua

VistaのためのPowerShellは、ここからダウンロードすることができます:microsoft.com/download/en/details.aspx?id=23200
Windos

7
注:このパイプラインは、ファイルを含まないが他のフォルダーを含むフォルダーを検索します。完全に空のフォルダを作成するには、パイプの3番目の要素をに変更し?{$_.GetFileSystemInfos().Count -eq 0}ます。
Richard

1
@ジョシュア、「C:\ Scripts」を検索したい場所に変更しなかったため、「パス 'C:\ Scripts'が存在しないため、見つかりません」というエラーが表示されます。それは行頭にあります。
ウィンドス

1
@ジョシュア、リチャーズのコメント(このスレッドの3番目)と私の回答の編集を読んだことがありますか?これにより、ファイルと子ディレクトリ(つまり、リーフノード)のないディレクトリのみが提供されます
Windos

2

以下は、1行のコードでこれを実現するための最も簡単な方法です。現在の場所にある空のディレクトリが一覧表示されます。再帰が必要な場合、パラメータ-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


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.