バッチファイルでもGUIボタンを使いたい

## バッチファイルは便利、でもユーザーフレンドリー？
Windowsのちょっとした処理であれば手順書を書くよりもバッチファイルを書いてしまったほうが手っ取り早いと思いますが、それを自分以外の誰かが実行する場合は黒い画面が開いたとたんに「何かハッキングされたみたいんですけど！」と慌ててしまう人も少なからず居たり、プロンプト画面をクリックして選択状態のまま止めてしまったりなど、実行ユーザーのリテラシーに依るところが有るかと思います。
Windows標準のVPN接続/切断操作を判りやすいようにとバッチファイルで作成したところ、コマンドプロンプトが開くことへの抵抗を感じるユーザーが少なく無かったことから、接続/接続のボタンをGUI配置して操作できるようにした流れから作成した感じです。

```batchfile
@echo off
rem ###############################
rem バッチファイルで
rem GUIボタンを配置する
rem ###############################


cd /d "%~dp0"
color 70
rem ﾟ+..｡*ﾟ+ .｡ﾟ+..｡ 威圧感の少ない白画面表示 ﾟ+..｡*ﾟ+ .｡ﾟ+..｡

rem ---- 最小化状態で実行する ----
if not "%X_MIMIMIZED%"=="1" (
    set X_MIMIMIZED=1
    start /min cmd /c,"%~0" %*
    exit
)

rem ---- オプション無しならGUIにJUMP ----
if "%1"=="" goto :GUI

rem ---- オプション別処理分岐 ----
if "%1"=="/B00" goto :B00
if "%1"=="/B01" goto :B01
if "%1"=="/B02" goto :B02
if "%1"=="/B03" goto :B03
if "%1"=="/B04" goto :B04
if "%1"=="/B05" goto :B05
if "%1"=="/B06" goto :B06
if "%1"=="/B07" goto :B07
if "%1"=="/B08" goto :B08
if "%1"=="/B09" goto :B09
if "%1"=="/B10" goto :B10
if "%1"=="/B11" goto :B11
if "%1"=="/B12" goto :B12
if "%1"=="/B13" goto :B13
if "%1"=="/B14" goto :B14
goto :EOF

rem ---- 実行処理
:B00
	echo ボタンを押してください
	goto :EOF
:B01
    timeout /t 10 >nul
	echo [完了] ボタン01の処理が完了しました
	goto :EOF
:B02
    timeout /t 10 >nul
	echo [完了] ボタン02の処理が完了しました
	goto :EOF
:B03
    timeout /t 10 >nul
	echo [完了] ボタン03の処理が完了しました
	goto :EOF
:B04
    timeout /t 10 >nul
	echo [完了] ボタン04の処理が完了しました
	goto :EOF
:B05
    timeout /t 10 >nul
	echo [完了] ボタン05の処理が完了しました
	goto :EOF
:B06
    timeout /t 10 >nul
	echo [完了] ボタン06の処理が完了しました
	goto :EOF
:B07
    timeout /t 10 >nul
	echo [完了] ボタン07の処理が完了しました
	goto :EOF
:B08
    timeout /t 10 >nul
	echo [完了] ボタン08の処理が完了しました
	goto :EOF
:B09
    timeout /t 10 >nul
	echo [完了] ボタン09の処理が完了しました
	goto :EOF
:B10
    timeout /t 10 >nul
	echo [完了] ボタン10の処理が完了しました
	goto :EOF
:B11
    timeout /t 10 >nul
	echo [完了] ボタン11の処理が完了しました
	goto :EOF
:B12
    timeout /t 10 >nul
	echo [完了] ボタン12の処理が完了しました
	goto :EOF
:B13
    timeout /t 10 >nul
	echo [完了] ボタン13の処理が完了しました
	goto :EOF
:B14
    timeout /t 10 >nul
	echo [完了] ボタン14の処理が完了しました
	goto :EOF

:GUI
rem ---- GUI部分
set TITLE=バッチファイルGUIボタン

Powershell ^
	[void] [System.Reflection.Assembly]::LoadWithPartialName("""System.Drawing""") ;^
	[void] [System.Reflection.Assembly]::LoadWithPartialName("""System.Windows.Forms""") ;^
	^
	$Rem = 'MainWindow' ;^
	$Form = New-Object System.Windows.Forms.Form ;^
	$Form.Size = New-Object System.Drawing.Size(410,290) ;^
	$Form.FormBorderStyle = """Fixed3D""" ;^
	$Form.Text = """%TITLE%""" ;^
	^
	$Rem = 'MessageBox' ;^
	$OutputBox = New-Object System.Windows.Forms.TextBox ;^
	$OutputBox.Location = New-Object System.Drawing.Size(10,120) ;^
	$OutputBox.Size = New-Object System.Drawing.Size(370,120) ;^
	$OutputBox.ReadOnly = $False ;^
	$OutputBox.MultiLine = $True ;^
	$OutputBox.ScrollBars = """None""" ;^
	$Form.Controls.Add($outputBox) ;^
	^
	$Font = New-Object System.Drawing.Font("""ＭＳ ゴシック""",11) ;^
	$Label = New-Object System.Windows.Forms.Label ;^
	$Label.Location = New-Object System.Drawing.Point(10,30) ;^
	$Label.Forecolor = """#000""" ;^
	    $connResult = cmd.exe /c '%~dpfx0' /B00 ^| Format-List ^| Out-String ;^
	    $OutputBox.Text = $connResult; ^
	^
	^
	$Rem = 'Button01' ;^
	$Button = New-Object System.Windows.Forms.Button ;^
	$Button.Location = New-Object System.Drawing.Size(10,10) ;^
	$Button.Size = New-Object System.Drawing.Size(70,30) ;^
	$Button.Text = """ボタン01""" ;^
	$Button.Add_Click({}) ;^
	$Form.Controls.Add($Button) ;^
	function Button01 { ^
	    $OutputBox.Text = """[開始] ボタン01の処理を開始しました""" ;^
	    $connResult = cmd.exe /c '%~dpfx0' /B01 ^| Format-List ^| Out-String ;^
	    $OutputBox.Text = $connResult ^
	} ;^
	$Button.Add_Click({Button01}) ;^
	^
	^
	$Rem = 'Button02' ;^
	$Button = New-Object System.Windows.Forms.Button ;^
	$Button.Location = New-Object System.Drawing.Size(85,10) ;^
	$Button.Size = New-Object System.Drawing.Size(70,30) ;^
	$Button.Text = """ボタン02""" ;^
	$Button.Add_Click({}) ;^
	$Form.Controls.Add($Button) ;^
	function Button02 { ^
	    $OutputBox.Text = """[開始] ボタン02の処理を開始しました""" ;^
	    $connResult = cmd.exe /c '%~dpfx0' /B02 ^| Format-List ^| Out-String ;^
	    $OutputBox.Text = $connResult ^
	} ;^
	$Button.Add_Click({Button02}) ;^
	^
	^
	$Rem = 'Button03' ;^
	$Button = New-Object System.Windows.Forms.Button ;^
	$Button.Location = New-Object System.Drawing.Size(160,10) ;^
	$Button.Size = New-Object System.Drawing.Size(70,30) ;^
	$Button.Text = """ボタン03""" ;^
	$Button.Add_Click({}) ;^
	$Form.Controls.Add($Button) ;^
	function Button03 { ^
	    $OutputBox.Text = """[開始] ボタン03の処理を開始しました""" ;^
	    $connResult = cmd.exe /c '%~dpfx0' /B03 ^| Format-List ^| Out-String ;^
	    $OutputBox.Text = $connResult ^
	} ;^
	$Button.Add_Click({Button03}) ;^
	^
	^
	$Rem = 'Button04' ;^
	$Button = New-Object System.Windows.Forms.Button ;^
	$Button.Location = New-Object System.Drawing.Size(235,10) ;^
	$Button.Size = New-Object System.Drawing.Size(70,30) ;^
	$Button.Text = """ボタン04""" ;^
	$Button.Add_Click({}) ;^
	$Form.Controls.Add($Button) ;^
	function Button04 { ^
	    $OutputBox.Text = """[開始] ボタン04の処理を開始しました""" ;^
	    $connResult = cmd.exe /c '%~dpfx0' /B04 ^| Format-List ^| Out-String ;^
	    $OutputBox.Text = $connResult ^
	} ;^
	$Button.Add_Click({Button04}) ;^
	^
	^
	$Rem = 'Button05' ;^
	$Button = New-Object System.Windows.Forms.Button ;^
	$Button.Location = New-Object System.Drawing.Size(310,10) ;^
	$Button.Size = New-Object System.Drawing.Size(70,30) ;^
	$Button.Text = """ボタン05""" ;^
	$Button.Add_Click({}) ;^
	$Form.Controls.Add($Button) ;^
	function Button05 { ^
	    $OutputBox.Text = """[開始] ボタン05の処理を開始しました""" ;^
	    $connResult = cmd.exe /c '%~dpfx0' /B05 ^| Format-List ^| Out-String ;^
	    $OutputBox.Text = $connResult ^
	} ;^
	$Button.Add_Click({Button05}) ;^
	^
	^
	$Rem = 'Button06' ;^
	$Button = New-Object System.Windows.Forms.Button ;^
	$Button.Location = New-Object System.Drawing.Size(10,45) ;^
	$Button.Size = New-Object System.Drawing.Size(70,30) ;^
	$Button.Text = """ボタン06""" ;^
	$Button.Add_Click({}) ;^
	$Form.Controls.Add($Button) ;^
	function Button06 { ^
	    $OutputBox.Text = """[開始] ボタン06の処理を開始しました""" ;^
	    $connResult = cmd.exe /c '%~dpfx0' /B06 ^| Format-List ^| Out-String ;^
	    $OutputBox.Text = $connResult ^
	} ;^
	$Button.Add_Click({Button06}) ;^
	^
	^
	$Rem = 'Button07' ;^
	$Button = New-Object System.Windows.Forms.Button ;^
	$Button.Location = New-Object System.Drawing.Size(85,45) ;^
	$Button.Size = New-Object System.Drawing.Size(70,30) ;^
	$Button.Text = """ボタン07""" ;^
	$Button.Add_Click({}) ;^
	$Form.Controls.Add($Button) ;^
	function Button07 { ^
	    $OutputBox.Text = """[開始] ボタン07の処理を開始しました""" ;^
	    $connResult = cmd.exe /c '%~dpfx0' /B07 ^| Format-List ^| Out-String ;^
	    $OutputBox.Text = $connResult ^
	} ;^
	$Button.Add_Click({Button07}) ;^
	^
	^
	$Rem = 'Button08' ;^
	$Button = New-Object System.Windows.Forms.Button ;^
	$Button.Location = New-Object System.Drawing.Size(160,45) ;^
	$Button.Size = New-Object System.Drawing.Size(70,30) ;^
	$Button.Text = """ボタン08""" ;^
	$Button.Add_Click({}) ;^
	$Form.Controls.Add($Button) ;^
	function Button08 { ^
	    $OutputBox.Text = """[開始] ボタン08の処理を開始しました""" ;^
	    $connResult = cmd.exe /c '%~dpfx0' /B08 ^| Format-List ^| Out-String ;^
	    $OutputBox.Text = $connResult ^
	} ;^
	$Button.Add_Click({Button08}) ;^
	^
	^
	$Rem = 'Button09' ;^
	$Button = New-Object System.Windows.Forms.Button ;^
	$Button.Location = New-Object System.Drawing.Size(235,45) ;^
	$Button.Size = New-Object System.Drawing.Size(70,30) ;^
	$Button.Text = """ボタン09""" ;^
	$Button.Add_Click({}) ;^
	$Form.Controls.Add($Button) ;^
	function Button09 { ^
	    $OutputBox.Text = """[開始] ボタン09の処理を開始しました""" ;^
	    $connResult = cmd.exe /c '%~dpfx0' /B09 ^| Format-List ^| Out-String ;^
	    $OutputBox.Text = $connResult ^
	} ;^
	$Button.Add_Click({Button09}) ;^
	^
	^
	$Rem = 'Button10' ;^
	$Button = New-Object System.Windows.Forms.Button ;^
	$Button.Location = New-Object System.Drawing.Size(310,45) ;^
	$Button.Size = New-Object System.Drawing.Size(70,30) ;^
	$Button.Text = """ボタン10""" ;^
	$Button.Add_Click({}) ;^
	$Form.Controls.Add($Button) ;^
	function Button10 { ^
	    $OutputBox.Text = """[開始] ボタン10の処理を開始しました""" ;^
	    $connResult = cmd.exe /c '%~dpfx0' /B10 ^| Format-List ^| Out-String ;^
	    $OutputBox.Text = $connResult ^
	} ;^
	$Button.Add_Click({Button10}) ;^
	^
	^
	$Rem = 'Button11' ;^
	$Button = New-Object System.Windows.Forms.Button ;^
	$Button.Location = New-Object System.Drawing.Size(10,80) ;^
	$Button.Size = New-Object System.Drawing.Size(70,30) ;^
	$Button.Text = """ボタン11""" ;^
	$Button.Add_Click({}) ;^
	$Form.Controls.Add($Button) ;^
	function Button11 { ^
	    $OutputBox.Text = """[開始] ボタン11の処理を開始しました""" ;^
	    $connResult = cmd.exe /c '%~dpfx0' /B11 ^| Format-List ^| Out-String ;^
	    $OutputBox.Text = $connResult ^
	} ;^
	$Button.Add_Click({Button11}) ;^
	^
	^
	$Rem = 'Button12' ;^
	$Button = New-Object System.Windows.Forms.Button ;^
	$Button.Location = New-Object System.Drawing.Size(85,80) ;^
	$Button.Size = New-Object System.Drawing.Size(70,30) ;^
	$Button.Text = """ボタン12""" ;^
	$Button.Add_Click({}) ;^
	$Form.Controls.Add($Button) ;^
	function Button12 { ^
	    $OutputBox.Text = """[開始] ボタン12の処理を開始しました""" ;^
	    $connResult = cmd.exe /c '%~dpfx0' /B12 ^| Format-List ^| Out-String ;^
	    $OutputBox.Text = $connResult ^
	} ;^
	$Button.Add_Click({Button12}) ;^
	^
	^
	$Rem = 'Button13' ;^
	$Button = New-Object System.Windows.Forms.Button ;^
	$Button.Location = New-Object System.Drawing.Size(160,80) ;^
	$Button.Size = New-Object System.Drawing.Size(70,30) ;^
	$Button.Text = """ボタン13""" ;^
	$Button.Add_Click({}) ;^
	$Form.Controls.Add($Button) ;^
	function Button13 { ^
	    $OutputBox.Text = """[開始] ボタン13の処理を開始しました""" ;^
	    $connResult = cmd.exe /c '%~dpfx0' /B13 ^| Format-List ^| Out-String ;^
	    $OutputBox.Text = $connResult ^
	} ;^
	$Button.Add_Click({Button13}) ;^
	^
	^
	$Rem = 'Button14' ;^
	$Button = New-Object System.Windows.Forms.Button ;^
	$Button.Location = New-Object System.Drawing.Size(235,80) ;^
	$Button.Size = New-Object System.Drawing.Size(70,30) ;^
	$Button.Text = """ボタン14""" ;^
	$Button.Add_Click({}) ;^
	$Form.Controls.Add($Button) ;^
	function Button14 { ^
	    $OutputBox.Text = """[開始] ボタン14の処理を開始しました""" ;^
	    $connResult = cmd.exe /c '%~dpfx0' /B14 ^| Format-List ^| Out-String ;^
	    $OutputBox.Text = $connResult ^
	} ;^
	$Button.Add_Click({Button14}) ;^
	^
	^
	$Rem = 'Button99' ;^
	$Button = New-Object System.Windows.Forms.Button ;^
	$Button.Location = New-Object System.Drawing.Size(310,80) ;^
	$Button.Size = New-Object System.Drawing.Size(70,30) ;^
	$Button.Text = """終了""" ;^
	$Button.Add_Click({}) ;^
	$Form.Controls.Add($Button) ;^
	function Button99 { ^
	    $OutputBox.Text = """終了します""" ;^
	    $dconResult = taskkill.exe /FI 'WINDOWTITLE eq %TITLE%' ^| Format-List ^| Out-String ;^
	    $OutputBox.Text = $dconResult ^
	} ;^
	$Button.Add_Click({Button99}) ;^
	^
	^
	$Form.Add_Shown({$Form.Activate()}) ;^
	[void] $Form.ShowDialog() ;^
Exit;
```
ボタン押下時の処理はサンプルコードではラベル呼び出しの形で[実行処理]部分のB01～B14に記述する形としています。急な機種別パッチ配布やプリンタ設定ツールの作成などもバッチファイルで手軽に書けると便利ですよね！

Windowやボタン等の配置は埋め込まれたPowershellからWindowsフォームを呼び出すことで行っているので、このあたりの保守性はあまり良くないかもしれません。