Powershellでファイルサイズの大きい順ランキングを作成する。
Powershellでファイルサイズの大きい順ランキングを作成する。
やること
- 指定したフォルダ($parent_folder)を再帰検索(一番下の階層まで検索)し取り出す。
- サイズ(Length)と、ファイル名フルパス(fullname)を表示する
- サイズをキーにして、降順でソートする
- 上位10ファイルを取り出す
--> 改善版を下に追記
$parent_folder = "c:\" Get-ChildItem -Path $parent_folder -Recurse | Select-Object Length,fullname | Sort-Object -Descending Length | Select-Object -first 10 #### 結果 Length FullName ------ -------- 487063552 C:\Windows\SoftwareDistribution\DataStore\DataStore.edb 244212156 C:\Windows\WinSxS\ManifestCache\efeb4d6159892b07_blobs.bin 140394280 C:\Windows\System32\MRT.exe 86573056 C:\Windows\System32\catroot2\{F750E6C3-38EE-11D1-85E5-00C04FC295EE}\catdb 82313216 C:\Windows\System32\config\SOFTWARE 75759616 C:\Windows\System32\config\COMPONENTS 75071248 C:\Windows\WinSxS\amd64_windows-defender-am-sigs_31bf3856ad364e35_10.0.14393.0_none_e9f929873253e3cd\MpAvBase.vdm 67764010 C:\Windows\servicing\Sessions\Sessions.back.xml 67764010 C:\Windows\servicing\Sessions\Sessions.xml 54989002 C:\Windows\IME\IMEJP\DICTS\SDDS0411.DIC
改善版(サイズを割って四捨五入しMB表記、最終更新日付を追加) --> さらに改善し、進捗プログレスバーを付けたものを下に追記
- 指定したフォルダ($parent_folder)を再帰検索(一番下の階層まで検索)し取り出す。
- サイズ(Length)と、ファイル名フルパス(fullname)、最終更新(LastWrite)を表示する
- 新しいオブジェクトを作成し、MB表記のファイルサイズ(MBSize)・ファイル名(Filename)・最終更新(LastWrite)の列に再編成
- MB表記のファイルサイズ(MBSize)をキーにして、降順でソートする
- 上位10ファイルを取り出す
&長くなったので関数にします
# du関数 function du-object ($parent_folder) { Get-ChildItem -Path $parent_folder -Recurse | Select-Object Length,fullname,LastWriteTime | %{New-Object psobject -Property @{SizeMB=[math]::round($_.Length/1024/1024);Filename=$_.fullname;LastWrite=$_.LastWriteTime}} | Sort-Object -Descending SizeMB | Select-Object -first 10 SizeMB,Filename,LastWrite } # 使ってみる du-object "C:\" #### 結果 #### Cドライブ 13.3GB 、157277ファイルの時、実行時間は1分45秒でした。 #### (T2micro、メモリ1GB、CPU1コア、64bit、Windows2016) SizeMB Filename LastWrite ------ -------- --------- 464 C:\Windows\SoftwareDistribution\DataStore\DataStore.edb 2018/04/21 16:49:08 233 C:\Windows\WinSxS\ManifestCache\efeb4d6159892b07_blobs.bin 2017/09/27 9:29:13 134 C:\Windows\System32\MRT.exe 2017/08/09 16:39:53 83 C:\Windows\System32\catroot2\{F750E6C3-38EE-11D1-85E5-00C04FC295EE}\catdb 2018/02/14 9:05:52 78 C:\Windows\System32\config\SOFTWARE 2018/02/19 20:01:57 72 C:\Windows\WinSxS\amd64_windows-defender-am-sigs_31bf3856ad364e35_10.0.14393.0_none_e9f929873253e3cd\MpAvBase.vdm 2016/07/16 22:19:22 72 C:\Windows\System32\config\COMPONENTS 2018/04/19 15:20:48 65 C:\Windows\servicing\Sessions\Sessions.xml 2018/02/01 16:19:36 65 C:\Windows\servicing\Sessions\Sessions.back.xml 2018/02/01 16:19:36 52 C:\Windows\WinSxS\amd64_microsoft-windows-fabric-core_31bf3856ad364e35_10.0.14393.0_none_4966e2304fdd7b6a\ServiceFabric.cab 2016/07/16 22:19:49
再改善版(進捗プログレスバーを追加)@2018/04/22
- 進捗表示用に、総ファイル数を変数格納する。その間は「進捗表示のために総ファイル数を確認しています....」とプログレスバーを表示する
- 指定したフォルダ($parent_folder)を再帰検索(一番下の階層まで検索)し取り出す。
- サイズ(Length)と、ファイル名フルパス(fullname)、最終更新(LastWrite)を表示する
- 新しいオブジェクトを作成し、MB表記のファイルサイズ(MBSize)・ファイル名(Filename)・最終更新(LastWrite)の列に再編成する。その間に、進捗プログレスバーを表示する。 ※2〜4の処理(ファイル検索と結果オブジェクトの作成)は一連で動き、4の処理の際に1ファイルずつ処理するため、プログレスバーを表示する処理をここに書く。
- MB表記のファイルサイズ(MBSize)をキーにして、降順でソートする。
- 上位10ファイルを取り出す ※5〜6(ソートと抽出)は負荷の低い処理で時間を取らないため(アルゴリズム的に2〜4が圧倒的に重い。)、進捗プログレスバーは不要となる。
# du関数 function du-object ($parent_folder) { # 進捗表示用に、総ファイル数を変数格納する処理。 write-progress "進捗表示のために総ファイル数を確認しています....";$totalfilecount=(Get-ChildItem -Path $parent_folder -Recurse |measure).count # カウント変数初期化 $cnt=0 # 処理 Get-ChildItem -Path $parent_folder -Recurse | Select-Object Length,fullname,LastWriteTime | %{New-Object psobject -Property @{SizeMB=[math]::round($_.Length/1024/1024);Filename=$_.fullname;LastWrite=$_.LastWriteTime};$cnt++;Write-Progress "現在の処理ファイル数:$cnt/$totalfilecount" -PercentComplete ($cnt/$totalfilecount*100)} | Sort-Object -Descending SizeMB | Select-Object -first 10 SizeMB,Filename,LastWrite } du-object "C:\Program Files (x86)"
結果
おまけ
Microsoftがインターネットで提供している無償ツールを使ってみる★
こちらはファイルではなくフォルダごと。
Sysinternals Suite マーク ルシノビッチ (著) https://technet.microsoft.com/ja-jp/sysinternals/bb842062.aspx
-> Microsoft TechNetの提供している無償ツール群です。psexec.exe が有名かと思います。 この中に、du.exeがあります。 du.exe は、引数に指定したフォルダ配下にある、各サブフォルダの容量をそれぞれKB表示します。 あくまでフォルダであり、ファイル1つ1つの容量は測れません。
-v オプションをつけると、全階層にあるサブフォルダの容量を、表示します。 下の例では、引数に指定したdesktopフォルダの下にある、dutestフォルダが24KBあり、 dutestフォルダ配下にある各サブフォルダの容量についても、それぞれ表示されています。(a:0KB、b:5KB、c:18KB、d:0KB)
-l [n] オプションをつけると、数字 n に指定した階層分にあるサブフォルダの容量を、表示します。 下の例では、引数に指定したdesktopフォルダの1階層下にある、dutestフォルダが24KBであることを表示しています。
-c オプションを使うと、CSV形式の出力になります。
#### C:\Users\Administrator\Downloads\SysinternalsSuite に解凍し、du.exe を実行する例 ############### # cmd(コマンドプロンプト)での例です。 # 存在確認 C:\Users\Administrator\Downloads\SysinternalsSuite>dir |findstr du.exe 2018/01/20 11:12 169,072 du.exe # du実行 -v オプション C:\Users\Administrator\Downloads\SysinternalsSuite>du -nobanner -accepteula -v C:\Users\Administrator\Desktop\ 0 c:\users\administrator\desktop\dutest\a 5 c:\users\administrator\desktop\dutest\b 18 c:\users\administrator\desktop\dutest\c 0 c:\users\administrator\desktop\dutest\d 24 c:\users\administrator\desktop\dutest Totals: Files: 73 Directories: 6 Size: 44,281 bytes Size on disk: 335,872 bytes # du実行 -l オプション C:\Users\Administrator\Downloads\SysinternalsSuite>du -nobanner -accepteula -l 1 C:\Users\Administrator\Desktop\ 24 c:\users\administrator\desktop\dutest Files: 73 Directories: 6 Size: 44,281 bytes Size on disk: 335,872 bytes # du実行 -l オプション その2(C:¥直下にて) ※悲しい点が判明:日本語が出てくれない・・・????になる C:\Users\Administrator\Downloads\SysinternalsSuite>du -nobanner -accepteula -l 1 C:\ 305 c:\$Recycle.Bin 18,112 c:\Boot 0 c:\copyto1 463 c:\inetpub 0 c:\PerfLogs 178,388 c:\Program Files 405,417 c:\Program Files (x86) 820,098 c:\ProgramData 0 c:\Recovery 1 c:\trace 281,124 c:\Users 10,359,980 c:\Windows 0 c:\work 0 c:\???????? Files: 119134 Directories: 35411 Size: 12,353,828,882 bytes Size on disk: 12,569,956,352 bytes # du実行 -c オプション ・・・使わなそう。。 C:\Users\Administrator\Downloads\SysinternalsSuite>du -nobanner -accepteula -l 1 -c C:\ Path,CurrentFileCount,CurrentFileSize,FileCount,DirectoryCount,DirectorySize,DirectorySizeOnDisk "c:\$Recycle.Bin",0,0,202,14,313144,1114112 "c:\Boot",7,1039552,88,42,18546700,18911232 "c:\copyto1",0,0,0,1,0,0 "c:\inetpub",0,0,122,14,474254,864256 "c:\PerfLogs",1,730,1,1,730,4096 "c:\Program Files",1,174,715,204,182669409,185163776 "c:\Program Files (x86)",1,174,957,130,415147429,417943552 "c:\ProgramData",0,0,830,415,839786548,787484672 "c:\Recovery",1,971,1,1,971,4096 "c:\trace",1,1910,1,1,1910,4096 "c:\Users",1,174,2003,902,287633977,297521152 "c:\Windows",25,7239908,114201,33682,10608619728,10860208128 "c:\work",1,14,1,1,14,4096 "c:\????????",0,0,0,1,0,0 "c:\",13,401972,119134,35411,12353596786,12569731072 ################################################################################################### ※ -nobanner は、標準出力に著作権情報を表示しないための、オプションです。 つけない場合は、毎回著作権情報が標準出力に表示されます。 また、初回実行した際にはソフトウェア使用許諾への同意が、画面ポップアップで表示されます。 -accepteula オプションは、画面ポップアップを表示しないで、先に同意しておくためのオプションです。これはpsexec.exeと同じです。
Powershellで実行する場合(参考)
# duコマンド(Sysinternals Suiteからダウンロードし、zip解凍したもの) $ducommand = "C:\Users\Administrator\Downloads\SysinternalsSuite\du.exe" # 捜索するディレクトリ(親) $parent_dir = "c:\" # 捜索する階層(数字) $kaisou = 1 # duコマンド実行 & $ducommand -nobanner -accepteula -l $kaisou $parent_dir #### 結果 305 c:\$Recycle.Bin 18,112 c:\Boot 0 c:\copyto1 463 c:\inetpub 0 c:\PerfLogs 178,388 c:\Program Files 405,417 c:\Program Files (x86) 820,124 c:\ProgramData 0 c:\Recovery 1 c:\trace 281,116 c:\Users 10,359,980 c:\Windows 0 c:\work 0 c:\???????? Files: 119134 Directories: 35411 Size: 12,353,846,180 bytes Size on disk: 12,569,968,640 bytes
Powershellで関数化して実行する場合(参考)
# du実行関数 (引数:捜索する親フォルダ、階層) function du-folder ($parent_dir,$kaisou) { # duコマンド実行 & $ducommand -nobanner -accepteula -l $kaisou $parent_dir } # duコマンド(Sysinternals Suiteからダウンロードし、zip解凍したもの) $ducommand = "C:\Users\Administrator\Downloads\SysinternalsSuite\du.exe" # 関数実行 du-folder c:\ 1 #### 結果 305 c:\$Recycle.Bin 18,112 c:\Boot 0 c:\copyto1 463 c:\inetpub 0 c:\PerfLogs 178,388 c:\Program Files 405,417 c:\Program Files (x86) 820,127 c:\ProgramData 0 c:\Recovery 1 c:\trace 280,957 c:\Users 10,359,980 c:\Windows 0 c:\work 0 c:\???????? Files: 119134 Directories: 35411 Size: 12,353,687,618 bytes Size on disk: 12,569,829,376 bytes PS C:\Users\Administrator>
フォルダのサイズを調べたいときは使ってみても良いかもですね! ありがとうございました。