- ベストアンサー
powershellでlinuxのduコマンドのような事がしたい。
powershellでlinuxのduコマンドのような事がしたい。 linuxのduコマンドはディレクトリの容量を知ることができますが、 同じ事をwindowsのpowershellで出来ないでしょうか。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
PowerShell には du のようなディレクトリサイズを量るコマンドはなかったと思うので、自分で作るしかないでしょう。こんなんでどうですか? Get-ChildItem -Recurse -Force | ForEach-Object -Begin { $i = 0 } -Process { $i = $i + $_.Length } -End { $i }
その他の回答 (2)
- UKY
- ベストアンサー率50% (604/1207)
あ、-Path の指定忘れてましたね……。(汗 おっしゃる通り、-Path で指定したディレクトリの中にあるファイルの合計サイズが出ます。(指定しないとカレントディレクトリ内) ちなみにディスクドライブ全体のサイズは Get-PSDrive コマンドで出るみたいですね
お礼
ありがとうございます。 あ、そうか! カレントでしたか。 言われてみると普通のことですが、何の値か分からずにしばらく困っていました。 Get-PSDrive コマンドも試したした。 これはこれで別途使えそうなので、ありがとうございます。
- himajin100000
- ベストアンサー率54% (1660/3060)
#普段Windows XPしか使ってないのでLinuxのコマンドよくわかりません。 #PowerShell標準のコマンドにはなさそうだったので、ゴリゴリとコードを書くハメに。プログラミングそのものなので、人によってはperlとかphpとか使いたくなるんじゃね、とか思った。面倒なので各種オプションは実装してないし、ファイルにしてコマンドライン引数受け取ったりしてないけど、プログラミングが出来ればそんなに難しくはないでしょう。 #自力実装したけどぶっちゃけ誰かが既に作ってそうな気がします。 ====================コード================= $dict = New-Object -typeName "System.Collections.Generic.Dictionary``2[System.IO.FileSystemInfo,System.Int64]" $rd = New-Object -typeName "System.IO.DirectoryInfo" -argumentList "D:\himajin100000\x86\Environment\Application" foreach($d in $rd.GetDirectories("*",[System.IO.SearchOption]::TopDirectoryOnly)){ $x = 0 foreach($f in $d.GetFiles("*",[System.IO.SearchOption]::AllDirectories)){ $x = $x + $f.Length } $dict.Add($d,$x) } foreach($f in $rd.GetFiles("*",[System.IO.SearchOption]::TopDirectoryOnly)){ $dict.Add($f,$f.Length) } foreach($kv in $dict.GetEnumerator()){ [System.String]::Format("{0:s} {1:d}",$kv.Key,$kv.Value) } =================結果================== Archiver 83836 b2x 875008 Development 26622315 Documents 265807804 Images 84152605 Mail 87406143 Management 19092745 TextEditor 1793048 aaa.txt 105 ==============その他================ 以下を参考にしましたが、Lengthプロパティを合計する、という実装になっており 以下のコードを実際に使ってみたところ、Lengthが全て空になっている状況、つまりフォルダしか存在しないディレクトリの内容を表示させようとしたとき、例外が発生し(フォルダとファイルが混在するものはOKでした)、何故かこれをうまく捕捉出来なかったので自力実装しました。 https://www.microsoft.com/technet/scriptcenter/resources/pstips/apr08/pstip0404.mspx 尚、"D:\"を直接指定したら"D:\System Volume Information"フォルダへのアクセス権を持たないために刎ねられてしまいました(汗 その他、PowerShellって.NET 4.0のメソッドとか使えないみたいね。System.IO.DirectoryInfo.GetFilesとかは最後まで値を求めないと制御が戻らないため、コードによってはSystem.IO.DirectoryInfo.EnumerateFiles何かは結構使いそうなものですが。
お礼
ありがとうございます。 o/sが変わればコマンド1つで出来ることも結構大変な事になってしまうのですね。
補足
ありがとうございます。 実行してみたところ、 結果は 454,932,877 実際のcドライブの使用容量は 78,522,511,360 大きくかけ離れました。 折角なので、どうにか使えないものかと試してみたところ、 -Pathで指定した場所の容量は正しく出てそうでした。 Get-ChildItem -Path "c:\Documents and Settings" -Recurse -Force | ForEach-Object -Begin { $Len = 0 } -Process { $Len = $Len + $_.Length } -End { $Len } 結果は 1,271,990,831 実際の"c:\Documents and Settings"の使用容量も 1,271,990,831 謎解きに時間が掛かってしまいましたが、こういう事でしょうか?