メニュー選択 コマンド・レット

Show-Menu コマンド・レット

Show-Menu.ps1 [PowerShell スクリプト]
# ■概要 #  メニューを画面中央に表示して、ユーザにメニュー項目を # 選択してもらう。 # # ■引数 #  引数 $menuItems でメニュー項目を指定する。 #  メニュー項目は以下のような連想配列の配列を定義する。 # # $menu200 = @( # @{ id = 201; text = 'A'; child = $Null }; # @{ id = 202; text = 'B'; child = $Null }; # ) # # $menuTop = @( # @{ id = 100; text = 'あ'; child = $Null }; # @{ id = 200; text = 'い'; child = $menu200 }; # @{ id = 300; text = 'う'; child = $Null }; # @{ id = 0; text = '-'; child = $Null }; # @{ id = 400; text = 'え'; child = $Null }; # ) # # ■戻り値 #  選択したメニュー項目の番号を返す。 #  メニュー項目を選択しなかった場合は 0 を返す。 Param( $menuItems ) $wk = @{ r = 0 } if( $menuItems -eq $Null ) { return $wk.r } Add-Type -AssemblyName System.Drawing Add-Type -AssemblyName System.Windows.Forms $f = [System.Windows.Forms.Form]::new() $f.FormBorderStyle = [System.Windows.Forms.FormBorderStyle]::None $f.ShowInTaskbar = $False $f.Size = [System.Drawing.Size]::new( 32, 32 ) $f.StartPosition = [System.Windows.Forms.FormStartPosition]::CenterScreen $f.Opacity = 0.0 $fnClick = { $wk.r = [Int32] $this.Tag } $cMenu = [System.Windows.Forms.ContextMenuStrip]::new() $cMenu.Add_Closing({ $f.Close() }) $f.ContextMenuStrip = $cMenu Function Add-Item( $menuL, $menuR ) { $menuR | %{ $y = $menuL.Add( $_.text ) $y.Tag = $_.id $y.Add_Click( $fnClick ) if( $_.child -ne $Null ) { Add-Item $y.DropDownItems $_.child } } } Add-Item $cMenu.Items $menuItems $f.Add_Shown({ $this.Activate() $bitAlignment = [System.Windows.Forms.LeftRightAlignment]::Right $cMenu.Show( $f, [System.Drawing.Point]::new(16, 16), $bitAlignment ) }) [void] $f.ShowDialog() $f.Dispose() $wk.r

使用サンプル

menu.ps1 [PowerShell スクリプト]
$menu200 = @( @{ id = 201; text = 'A'; child = $Null }; @{ id = 202; text = 'B'; child = $Null }; ) $menuTop = @( @{ id = 100; text = 'あ'; child = $Null }; @{ id = 200; text = 'い'; child = $menu200 }; @{ id = 300; text = 'う'; child = $Null }; @{ id = 0; text = '-'; child = $Null }; @{ id = 400; text = 'え'; child = $Null }; ) Show-Menu $menuTop

使用サンプルの呼出し
(PowerShell の実行ポリシーがデフォルトのままでも実行できるようにする)

menu.js [JScript]
// PowerShell の実行ポリシーを緩めて .PS1 を実行する // 本スクリプトと同じ場所(フォルダ)に格納しているコマンド・レットを // 実行できるようするためにフォルダ・パスを取得する var nSlash = WScript.ScriptFullName.lastIndexOf( "\\" ); var strPath = WScript.ScriptFullName.substring( 0, nSlash ); // 以下の 2 つを実行する PowerShell コードを生成 // 1. 取得したフォルダ・パスを環境変数 PATH に追加 // 2. コマンドレット menu.ps1 の実行 var strCmdLet = "$env:Path += ';" + strPath + "' ; menu"; // 外部コマンド(PowerShell)を実行するためにシェルを生成 var sh = new ActiveXObject( "WScript.Shell" ); // PowerShell 実行 sh.Run( "PowerShell -ExecutionPolicy RemoteSigned -Command \"& { " + strCmdLet + " }\"", 0 );

使用サンプルの実行画面