Powershellでファイルサイズの大きい順ランキングを作成する。

Powershellでファイルサイズの大きい順ランキングを作成する。

やること

  1. 指定したフォルダ($parent_folder)を再帰検索(一番下の階層まで検索)し取り出す。
  2. サイズ(Length)と、ファイル名フルパス(fullname)を表示する
  3. サイズをキーにして、降順でソートする
  4. 上位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表記、最終更新日付を追加) --> さらに改善し、進捗プログレスバーを付けたものを下に追記

  1. 指定したフォルダ($parent_folder)を再帰検索(一番下の階層まで検索)し取り出す。
  2. サイズ(Length)と、ファイル名フルパス(fullname)、最終更新(LastWrite)を表示する
  3. 新しいオブジェクトを作成し、MB表記のファイルサイズ(MBSize)・ファイル名(Filename)・最終更新(LastWrite)の列に再編成
  4. MB表記のファイルサイズ(MBSize)をキーにして、降順でソートする
  5. 上位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

  1. 進捗表示用に、総ファイル数を変数格納する。その間は「進捗表示のために総ファイル数を確認しています....」とプログレスバーを表示する
  2. 指定したフォルダ($parent_folder)を再帰検索(一番下の階層まで検索)し取り出す。
  3. サイズ(Length)と、ファイル名フルパス(fullname)、最終更新(LastWrite)を表示する
  4. 新しいオブジェクトを作成し、MB表記のファイルサイズ(MBSize)・ファイル名(Filename)・最終更新(LastWrite)の列に再編成する。その間に、進捗プログレスバーを表示する。 ※2〜4の処理(ファイル検索と結果オブジェクトの作成)は一連で動き、4の処理の際に1ファイルずつ処理するため、プログレスバーを表示する処理をここに書く。
  5. MB表記のファイルサイズ(MBSize)をキーにして、降順でソートする。
  6. 上位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)"

結果

f:id:yamazoon:20180423024556p:plain f:id:yamazoon:20180423024624p:plain f:id:yamazoon:20180423024608p:plain f:id:yamazoon:20180423024651p:plain f:id:yamazoon:20180423024704p:plain




おまけ

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>

フォルダのサイズを調べたいときは使ってみても良いかもですね! ありがとうございました。

bitFlyer ビットコインを始めるなら安心・安全な取引所で