PowerShellでのUnix風メニュー画面サンプルスクリプト(備忘)
実行イメージ


スクリプト本体
################################################################################
#処理概要
# メニュー画面スクリプト
#
#スクリプト仕様
# スクリプトファイル名 : Menu.ps1
# スクリプト名称 : メニュー画面スクリプト
# 引数 : なし
# 戻り値 : 0 … 正常終了
# 1 … 以上終了
# ログファイル : なし
# 定義ファイル : Menu.conf (メニュー定義ファイル)
# 起動方法 : PowerShellから呼び出し「Menu.ps1」
# 備考 : なし
#
#更新履歴
# Ver. 日付 コメント 担当
# -------- ---------- ------------------------------------------------------------ ----------
# V 1.00. 2025/01/01 新規作成
#
##### 変数 #####
$ScriptFile = Split-Path -Leaf $PSCommandPath # スクリプトファイル名
$ScriptDir = $PSScriptRoot + "\" # スクリプトファイルの格納ディレクトリ
$ScriptConfFile = ${ScriptFile}.Split(".")[0] + ".conf" # スクリプト定義ファイル名
$ScriptConf = ${ScriptDir} + ${ScriptConfFile} # スクリプト定義ファイル(フルパス)
$Header = '親番号', '番号', 'メニュー項目', 'コマンドフルパス', 'コマンドライン引数', 'コメント'
# スクリプト定義ファイルのヘッダ
$Choice = 0 # メニュー番号
$Confirm = $False # 確認フラグ
$MenuItems = @() # メニューアイテム
$SelectedItem = @() # メニューアイテムから抽出されたアイテム
##----- 画面バッファ・ウィンドウサイズ設定 -----
$BufferSize = (Get-Host).UI.RawUI.BufferSize
$BufferSize.Width = 1000
$BufferSize.Height = 9000
(Get-Host).UI.RawUI.BufferSize = $BufferSize
$WindowSize = (Get-Host).UI.RawUI.WindowSize
$WindowSize.Width = 180
$WindowSize.Height = 40
(Get-Host).UI.RawUI.WindowSize = $WindowSize
##----- 設定ファイル読み込み -----
if ( (Test-Path ${ScriptConf}) -eq $True ) {
$MenuItems = (Import-Csv -Path ${ScriptConf} -Encoding Default -Header ${Header} | Where-Object { ($_.番号 -notmatch "^#") -and ($_.番号 -ne "") })
} else {
Write-Host ("【ERR】ファイルが存在しません。[メニュー定義ファイル: " + ${ScriptConf} + "]")
Read-Host "`r`n`r`n「Enter」を押してください。"
exit 1
}
function Show-Menu {
param ($ParentId = 0) #デフォルトはメインメニュー
Clear-Host
Write-Host "===================================================================================================="
Write-Host " コマンド実行メニュー "
Write-Host "===================================================================================================="
$FilteredItems = ${MenuItems} | Where-Object { $_.親番号 -eq ${ParentId} }
foreach ( $item in ${FilteredItems} ) {
Write-Host (([string]($($item.番号))).PadLeft(4) + ". " + $($item.メニュー項目) )
}
Write-Host "===================================================================================================="
}
##----- メインメニューから開始 -----
$ParentId = 0
do {
Show-Menu -ParentId ${ParentId}
$Choice = Read-Host "実行したい番号を入力してください。"
$SelectedItem = $MenuItems | Where-Object { ($_.親番号 -eq ${ParentID}) -and ($_.番号 -eq ${Choice}) }
if (${SelectedItem} -eq $null) {
Write-Host "無効な選択です。もう一度入力してください。"
Start-Sleep -Second 1
continue
}
if (${SelectedItem}.メニュー項目 -eq "戻る") {
##----- メインメニューに戻る -----
$ParentId = 0
continue
}
if (${SelectedItem}.メニュー項目 -eq "終了") {
Write-Host "メニューを終了します。"
exit 0
}
if (${SelectedItem}.コマンドフルパス -eq "") {
##----- サブメニューへ移動 -----
$ParentId =${Choice}
} else {
##----- スクリプト実行 -----
$Confirm = Read-Host "`nこの内容($(${SelectedItem}.メニュー項目))を実行しますが良いですか? (Y/N)"
if ( ${Confirm} -eq "Y" ) {
Write-Host ($(${SelectedItem}.メニュー項目) + " を実行します。")
if ( ($(${SelectedItem}.コマンドライン引数) -ne "") -and ($(${SelectedItem}.コマンドライン引数) -ne $null) ) {
& $(${SelectedItem}.コマンドフルパス) $(${SelectedItem}.コマンドライン引数)
} else {
& $(${SelectedItem}.コマンドフルパス)
}
} else {
Write-Host ($(${SelectedItem}.メニュー項目) + " の実行をキャンセルしました。")
}
$ReturnToMenu = Read-Host "`r`n`r`n戻ります。「Enter」を押してください。"
}
} while ($true)
定義ファイル
#メニュー画面定義ファイル
#<親番号>,<番号>,<メニュー項目>,<コマンドフルパス>,<コマンドライン引数>,<コメント>
#コマンドライン引数にはワイルドカードの指定が可能
#
0,1,OS情報メニュー,
0,2,サービス系メニュー,,
0,3,ネットワーク系メニュー,,
0,0,終了,,,
1,1,ホスト名表示,hostname,,
1,2,日付表示,Get-Date,,
1,3,バージョン情報,cmd,/c ver;exit,
1,0,戻る,,
2,1,サービス一覧取得,Get-Service,*,
2,0,戻る,,
3,1,IPアドレス表示,ipconfig,/all,
3,2,netstat表示,netstat,-an,
3,0,戻る,,
コメント