📃
dirquota quota listの出力をCSVにする
はじめに
Windows Serverでファイルサーバを運用している際、dirquota quota list
を使って設定を取得することがあるかと思います。
ところがこのコマンドの出力結果はテキストなので扱いづらいです。
今回は、その出力結果をCSVにするPowerShellスクリプトを作成しました。
概要
- 日本語で出力された
dirquota quota list
をパイプで渡します- マッチの部分を置き換えれば、別言語でも対応できるかもしれません
- PowerShellオブジェクトに格納し、最後にCSVに変換しています
参考
スクリプト
空行をクォーターの区切れとして、空行ごとに格納していきます。
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