テキストファイルのデータを並べ替える

テキストファイルからデータを取得し、並べ替えてファイルに出力してみました。まず、テキストファイルからデータを取得することに関してですが、Select-stringコマンドレットを使用しました。Select-stringコマンドレットはunixでいうgrep みたいな機能を持っています。検索する文字列はオプションなしで正規表現で指定できます。また、戻り値のオブジェクトから検索結果の文字列を取得することが出来ます。今回は2種類の文字列を取得しました。1つめが取得する項目の名前、2つ目がそれに対応する値です。これをハッシュテーブルに格納します。ハッシュテーブルのソートはsort-objectコマンドレットを使用します。-Descendingオプションで降順でソートます。なお、ハッシュテーブルからsort-objectに渡す際は、そのまま渡すのではなくHashtableEnumeratorオブジェクトを使わなければいけないみたいです。そのため、getenumeratorメソッドを使ってからsort-objectに渡しています。

set-PSDebug -strict
# --------------------------------
# コマンドプロンプトのdir /Sのtextファイルから
# ディレクトリとサイズを取得する
# --------------------------------
function GetFolderSizeFromText{

    # 引数の取得
    param([string]$infile_path)
    
    # 検索パターン設定
    $p1 = "(?<=^\s).*(?=\sのディレクトリ$)"
    $p2 = "(?<=^.{17}個のファイル\s*)\d.*(?=\sバイト$)"
    $pattern = "($p1|$p2)"
    
    # 検索結果取得
    $result = select-String -path $infile_path -pattern $pattern -Encoding "OEM"
    
    # ハッシュに格納
    $size_list = @{}
    for ( $n = 0; $n -le $result.length -1; $n += 2 ){
        $name  = ($result[$n].matches)[0].value
        [string]$value = ($result[$n+1].matches)[0].value
        $value = $value.replace(",","")
        $size_list[$name] = [long]$value
    }
    
    # 出力ファイルパス作成
    $directory = (get-Item $infile_path).directoryname
    $base_name = (get-Item $infile_path).basename
    $outfile_path  = $directory + "\" + $base_name + "_dir_size" + ".txt"
    
    # サイズの大きい順に出力
    $size_list.getenumerator() | sort-Object -property value -Descending | format-List | out-File $outfile_path
}