PowerShellでUnix風のメニュー画面を作ろう

PowerShell
PowerShell

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,戻る,,

コメント