📃

dirquota quota listの出力をCSVにする

2024/08/25に公開

はじめに

Windows Serverでファイルサーバを運用している際、dirquota quota listを使って設定を取得することがあるかと思います。
ところがこのコマンドの出力結果はテキストなので扱いづらいです。
今回は、その出力結果をCSVにするPowerShellスクリプトを作成しました。

概要

  • 日本語で出力されたdirquota quota listをパイプで渡します
    • マッチの部分を置き換えれば、別言語でも対応できるかもしれません
  • PowerShellオブジェクトに格納し、最後にCSVに変換しています

参考

https://amnich.github.io/Convert-output-from-Dirquota-quota-list-to-a-PS-Object/

https://www.rootlinks.net/2020/08/20/windows-serverのquota設定を確認-dirquota/

スクリプト

空行をクォーターの区切れとして、空行ごとに格納していきます。

ConvertFrom-DirquotaList.ps1
param (
    [Parameter(ValueFromPipeline = $True)]
    $InputObject
)

BEGIN {
    function Convert-GB {
        param (
            $string, $figure
        )
        switch ($figure) {
            "GB" { return [math]::round(([double]$string), 2) }
            "MB" { return [math]::round(([double]$string / 1024), 2) }
            "KB" { return [math]::round(([double]$string / (1024 * 1024)), 2) }
        }
    }

    # Quota のリストを保存する配列
    $QuotaList = @()
    $CurrentQuota = @{}
}

PROCESS {
    # メインループ
    foreach ($line in $InputObject) {
        if ($line -eq "") {
            # 空行でクォータの区切りとみなす
            if ($CurrentQuota.Count -gt 0) {
                $QuotaList += New-Object PSObject -Property $CurrentQuota
                $CurrentQuota = @{}
            }
        } else {
            # 行ごとの解析
            Switch -Regex ($line) {
                "クォータのパス:" {
                    $CurrentQuota.QuotaPath = ($line -replace "^.*?:", "").Trim()
                    break
                }
                "説明:" {
                    $CurrentQuota.Description = ($line -replace "^.*?:", "").Trim()
                    break
                }
                "共有パス:" {
                    $CurrentQuota.SharePath = ($line -replace "^.*?:", "").Trim()
                    break
                }
                "ソース テンプレート:" {
                    $CurrentQuota.SourceTemplate = ($line -replace "^.*?:", "").Trim()
                    break
                }
                "クォータの状態:" {
                    $CurrentQuota.QuotaStatus = ($line -replace "^.*?:", "").Trim()
                    break
                }
                "制限:" {
                    # matchの結果(True)が標準出力されないよう、$nullに代入
                    $null = ($line -replace "^.*?:", "").Trim() -match "^([\d\.]+).*(KB|MB|GB).*\((.+)\)$"
                    $CurrentQuota.LimitGB = Convert-GB -string $Matches[1] -figure $Matches[2]
                    $CurrentQuota.LimitType = $Matches[3]
                    $CurrentQuota.LimitText = ($line -replace "^.*?:", "").Trim()
                    break
                }
                "使用領域:" {
                    # matchの結果(True)が標準出力されないよう、$nullに代入
                    $null = ($line -replace "^.*?:", "").Trim() -match "^([\d\.]+).*(KB|MB|GB).*$"
                    $CurrentQuota.UsedGB = Convert-GB -string $Matches[1] -figure $Matches[2]
                    $CurrentQuota.UsedText = ($line -replace "^.*?:", "").Trim()
                    break
                }
                "利用可能:" {
                    # matchの結果(True)が標準出力されないよう、$nullに代入
                    $null = ($line -replace "^.*?:", "").Trim() -match "^([\d\.]+).*(KB|MB|GB).*$"
                    $CurrentQuota.AvailableGB = Convert-GB -string $Matches[1] -figure $Matches[2]
                    $CurrentQuota.AvailableText = ($line -replace "^.*?:", "").Trim()
                    break
                }
                "ピーク時の使用率:" {
                    # matchの結果(True)が標準出力されないよう、$nullに代入
                    $null = ($line -replace "^.*?:", "").Trim() -match "^([\d\.]+).*(KB|MB|GB).*\((.+)\)$"
                    $CurrentQuota.PeakGB = Convert-GB -string $Matches[1] -figure $Matches[2]
                    $CurrentQuota.PeakDate = $Matches[3]
                    break
                }
                "^\s+(警告|制限)" {
                    # "しきい値"の個所は、まとめて入れてしまう
                    $CurrentQuota.threshold += ($line -replace " ", "").Trim() + " / "
                    break
                }
            }
        }
    }
}

END {
    # 最後のクォータ設定を保存
    if ($CurrentQuota.Count -gt 0) {
        $QuotaList += New-Object PSObject -Property $CurrentQuota
    }

    # 結果をCSV形式で出力
    # $QuotaList | ConvertTo-Csv -NoTypeInformation | Out-File "output.csv"
    # 結果を絞ったり、並び替えたりする場合
    $QuotaList |
        Select-Object QuotaPath, SharePath, LimitGB, UsedGB, UsedText |
        ConvertTo-Csv -NoTypeInformation | Out-File "output.csv"

}
  • ByteはGBにしています。
    • 変換ミスとかあるかもなので、各項目xxxTextという名前で保存しています
  • "しきい値"の項目はテキストとしてまとめて格納しました。
  • 出力について
    • 出力の並びを任意にしたり、絞ったりする場合はSelect-Objectで調整します。
    • CSVにせずオブジェクトのまま出力する場合は、$QuotaListのまま出力します。

使い方

ConvertFrom-DirquotaList.ps1を保存したフォルダに移動して、以下のように実行します。

dirquota quota list | ./ConvertFrom-DirquotaList.ps1

おわりに

今回はテキスト出力されるdirquota quota listの結果をCSV化してみました。
参考のサイトは英語で、かつ項目の出力順が固定で決め打ちされていたので、自分で作ってみました。
この記事がどなたかのお役に立てれば幸いです。

Discussion