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


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

* やること
 
1. 指定したフォルダ（$parent_folder）を再帰検索(一番下の階層まで検索)し取り出す。
2. サイズ(Length)と、ファイル名フルパス(fullname)を表示する
3. サイズをキーにして、降順でソートする
4. 上位10ファイルを取り出す

## **--> 改善版を下に追記**</u>


```powershell

$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ファイルを取り出す

＆長くなったので関数にします

```powershell

# 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が圧倒的に重い。)、進捗プログレスバーは不要となる。

```powershell



# 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](https://qiita-image-store.s3.amazonaws.com/0/35156/c67656fe-f6fb-3a19-31ec-cc9922c92773.png)
![2.png](https://qiita-image-store.s3.amazonaws.com/0/35156/6697358d-4627-48c6-6dda-2356302f3f6b.png)
![5.png](https://qiita-image-store.s3.amazonaws.com/0/35156/31845141-be28-6d30-8950-05a84c74635d.png)
![3.png](https://qiita-image-store.s3.amazonaws.com/0/35156/9b421d6b-2e76-d40b-4b89-66422d00b010.png)
![4.png](https://qiita-image-store.s3.amazonaws.com/0/35156/3a72ee31-0161-295c-7ca4-2c65b0e39d4f.png)



<br>
<br>
<br>
# おまけ
## Microsoftがインターネットで提供している無償ツールを使ってみる★
**こちらはファイルではなくフォルダごと。**

Sysinternals Suite    マーク ルシノビッチ (著)
https://technet.microsoft.com/ja-jp/sysinternals/bb842062.aspx

<br>

-> Microsoft TechNetの提供している無償ツール群です。psexec.exe が有名かと思います。
この中に、du.exeがあります。
du.exe は、引数に指定したフォルダ配下にある、各サブフォルダの容量をそれぞれKB表示します。
**あくまでフォルダであり、ファイル１つ１つの容量は測れません。**

<br>

-v オプションをつけると、全階層にあるサブフォルダの容量を、表示します。
下の例では、引数に指定したdesktopフォルダの下にある、dutestフォルダが24KBあり、
dutestフォルダ配下にある各サブフォルダの容量についても、それぞれ表示されています。(a:0KB、b:5KB、c:18KB、d:0KB)


<br>

-l [n] オプションをつけると、数字 n に指定した階層分にあるサブフォルダの容量を、表示します。
下の例では、引数に指定したdesktopフォルダの1階層下にある、dutestフォルダが24KBであることを表示しています。

<br>

-c オプションを使うと、CSV形式の出力になります。

<br>

```powershell


#### 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で実行する場合(参考)

```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で関数化して実行する場合(参考)

```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>

```

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