メニュー選択 コマンド・レット
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 );
使用サンプルの実行画面