#author("2017-02-09T12:54:44+09:00","","")
#navi(../)

* ディレクトリ(フォルダ)単位でファイル容量の合計を出力する [#hc234363]
PowerShellを用い、ディレクトリ単位でファイル容量を出力する方法を以下に記します。~
本資料では、簡単なサンプルを公開しています。~

#contents
#htmlinsertpcsp(win-top.html,win-sp.html)

* 参考サイト記事 [#f76520f2]
-[[PowerShellのカスタムオブジェクト(PSCustomObject)の使い方>http://blog.livedoor.jp/morituri/archives/54579410.html]]


* 関連記事 [#a66d6f5f]
-[[PowerShellでファイル数・ディレクトリ数をカウントする方法>PowerShell/ファイル数・ディレクトリ数をカウントする方法]]


* ディレクトリ内のファイル合計サイズを出力する [#y01555d6]

以下のスクリプトは、現在いるカレントディレクトリ内にあるフォルダを対象とし、そのフォルダ内にあるファイル容量の合計値を取得します。~
 $o = @()
 Get-ChildItem . | Where-Object PSisContainer | %{ $PATH=$_; Get-ChildItem -Force -Recurse $_ | Measure-Object -Sum Length } | %{ $o += ([PSCustomObject]@{ PATH=$PATH.FullName; SUM=$_.Sum })}
 $o

上記のスクリプトを起動すると以下のように出力されます。~
尚、カレントディレクトリ(.)上にある、ファイルは対象外となります。~
以下の例では、C:\Windows\Microsoft.NET を対象にファイルサイズを取得しました。
 PS C:\> cd C:\Windows\Microsoft.NET
 PS C:\Windows\Microsoft.NET> $o = @()
 PS C:\Windows\Microsoft.NET> Get-ChildItem . | Where-Object PSisContainer | %{ $PATH=$_; Get-ChildItem -Force -Recurse $_ | Measure-Object -Sum Length } | %{ $o += ([PSCustomObject]@{ PATH=$PATH.FullName; SUM=$_.Sum })}
 PS C:\Windows\Microsoft.NET> $o
 
 PATH                                       SUM
 ----                                       ---
 C:\Windows\Microsoft.NET\assembly    168640526
 C:\Windows\Microsoft.NET\Framework   263581306
 C:\Windows\Microsoft.NET\Framework64 551896484

ディレクトリ構造を確認します。~
&color(red){バグ発見です!};~
以下のスクリーンショットの通り、4つのフォルダがあるのに、authmanが表示されていません。~
調べてみると、Get-ChildItemで指定したフォルダ内にファイルが1つもないとnullを返却しており、~
後方の処理に渡らない事が判明しました。
#ref(01.png)


* Functionで実現・Get-DirTotalFileSize() [#a0ec21a5]
if else を使うとパイプラインがうまく動作しなかったので、以下のように関数にしました。
以下のように関数として作成しました。
#ref(func.ps1)
 Function Get-DirTotalFileSize() {
   if ($args.Length -ne 1) {
     $Host.UI.WriteErrorLine("Usage: Get-DirectorySize <path>")
     return
   }
   $pathto = $args[0]
   if (!(Test-Path -PathType Container $pathto)) {
     $Host.UI.WriteErrorLine("Cannot access $pathto : No such directory")
     return
   }
 
   $o = @()
   $dirs = Get-ChildItem $pathto | Where-Object PSisContainer
   $dirs | % {
     $PATH=$_;
     if ((Get-ChildItem $_.FullName).Length -ne 0) {
       $measure = Get-ChildItem -Force -Recurse $_.FullName | Measure-Object -Sum Length
       $o += [PSCustomObject]@{ PATH=$PATH.FullName; SUM=$measure.Sum }
     } else {
       $o +=  [PSCustomObject]@{ PATH=$PATH.FullName; SUM=0 }
     }
   }
   $o
 }

** 実行してみる [#e7dc49aa]
上記のスクリプトをダウンロードするか、テキストエディタに貼り付け保存してください。~
尚、拡張子はps1にしてください。~
以下の例は、デスクトップに保存し使用した例です。~
面倒であれば、上記スクリプトをPowerShellのコンソールに貼り付けてもOKです。
-スクリプトの取込み~
dotににより、スクリプトを取込みます。(Linuxなどのshellと同じですね。)
 . PS C:\> . C:\Users\sakura\Desktop\func.ps1

-エラー処理およびディレクトリを指定して実行
 PS C:\> Get-DirTotalFileSize
 Usage: Get-DirectorySize <path>
 PS C:\> Get-DirTotalFileSize hoge
 Cannot access hoge : No such directory
 PS C:\> Get-DirTotalFileSize C:\Windows\Microsoft.NET
 
 PATH                                       SUM
 ----                                       ---
 C:\Windows\Microsoft.NET\assembly    168640526
 C:\Windows\Microsoft.NET\authman             0
 C:\Windows\Microsoft.NET\Framework   263581306
 C:\Windows\Microsoft.NET\Framework64 551896484

- ファイル合計値が正しいか確認
エクスプローラで1つ確認し、値が正しいか確認しました。
#ref(02.png)

* CSVにしてみる [#e6d22568]
上記の関数により、ファイルサイズ一覧が取得できたので、CSVにしてみます。
 PS C:\> $d = Get-DirTotalFileSize C:\Windows\Microsoft.NET
 PS C:\> $d | Export-Csv -NoTypeInformation -Encoding Default list.csv
 PS C:\> notepad.exe .\list.csv
csv出力されているのが確認できます。
#ref(03.png)

以上、PowerShellでディレクトリ内のファイル総合計容量を確認する方法でした。

#htmlinsertpcsp(win-btm.html,win-sp.html)



トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS