LoginSignup
11
12

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-04-19

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表記、最終更新日付を追加)@2018/04/20

--> さらに改善し、進捗プログレスバーを付けたものを下に追記

  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)"


結果

1.png
2.png
5.png
3.png
4.png






おまけ

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>

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

11
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
12