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表記、最終更新日付を追加)@2018/04/20
--> さらに改善し、進捗プログレスバーを付けたものを下に追記
- 指定したフォルダ($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>
フォルダのサイズを調べたいときは使ってみても良いかもですね!
ありがとうございました。