Powershellでバッチファイルを呼び出すメインメニュー的なものを作る 

# はじめに
記事の掲載内容は私自身の見解であり、所属する組織を代表するものではありません（お約束）。
今回はPowerShell経由からBATファイルを管理者権限で実行するプログラムを作ってみましたのでご紹介します。

# 出来上がったもの

後ほどご紹介するソースファイルを実行すると以下のような画面が出てきます。
こちらに表示されているボタンを押下すると、バッチが起動できます。
また、「管理者権限で実行」のチェックボックスを外すと、管理者権限にならずに実行できます。
ボタンに表示されるテキストはBATファイル名になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528240/e6dc23e4-0385-2850-491f-d6179d4dfc97.png)
※フォームのサイズについてボタン数によって動的に変化します。


# ソースコード

<details><summary>WindowsBatLister.ps1</summary><div>

```powershell
using namespace System.Windows.Forms
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing

# フォーム情報
#region designer

    # カレントディレクトリ
    $scriptPath = Get-Location
    
    # フォントの設定
    $Font = New-Object System.Drawing.Font("メイリオ",8)

    # フォーム
    $form = New-Object Form
    $form.Text = "バッチ一覧($scriptPath)"
    $form.MaximizeBox = $false
    $form.MinimizeBox = $false
    $form.StartPosition = "CenterScreen"
    $form.Size = "565, 150"
    $form.font = $Font

    # チェックボックス
    $CheckedBox = New-Object CheckBox
    $CheckedBox.Text = "管理者権限で実行"
    $CheckedBox.size ="200,22" 
    $CheckedBox.Location = "5, 5"
    $CheckedBox.Checked = $True
    $CheckedBox.font = $Font
    $form.Controls.Add($CheckedBox)

    function Form_Load
    {
        $LocationX = 25
        $LocationY = 30
        $i = 1        

        # サブフォルダ含まない
        #$itemList = Get-ChildItem $dir
        # サブフォルダ含む
        $itemList = Get-ChildItem $dir -Recurse
        foreach($item in $itemList)
        {
            #bat,cmdファイルのみ
            if($item.Extension -eq ".bat" -or $item.Extension -eq ".cmd")
            {
                #除外するファイル
                if($item.Name -eq "")
                {
                    continue
                }

                $btn = New-Object Button
                $btn.font = $Font
                #ボタン名は置換可能
                $btn.Text =  [regex]::Replace($item.BaseName, "", "")
                $btn.Tag = $item.FullName
                $btn.Size = "150, 50"
                $btn.Location = "$LocationX,$LocationY"

                #3個ボタンを設置したら次の行へ
                if($i % 3 -eq 0)
                {
                    $LocationX = 25
                    $LocationY += $btn.height + 25
                    $form.Height += $btn.height + 25
                } else 
                {
                    $LocationX += $btn.Width + 25
                }
                $btn.Add_Click({
                     # 管理者権限で実行
                     If($CheckedBox.Checked)
                     {
                        Start-Process -FilePath $this.Tag -Verb runas
                     }
                     else
                     {
                        Start-Process -FilePath $this.Tag
                     }
                     
                })
                $form.Controls.Add($btn)
                $i += 1
            }
        }
        $form.MaximumSize = $form.Size
        $form.MinimumSize = $form.Size
    }
#endregion

# スタートアップ処理
#region startup
    Form_Load
    $form.ShowDialog()
#endregion

```
</div></details>

# [おまけ]テスト用バッチファイル作成ソースコード
動作確認用として、ダミーのBATファイルを複数作成するBATファイルも作ってみました。

<details><summary>CreateTestFiles.bat</summary><div>

```bat
@echo off
echo echo 〇〇システムA機能.bat >> 〇〇システムA機能.bat
echo echo 〇〇システムB機能.bat >> 〇〇システムB機能.bat
echo echo 〇〇システムC機能.bat >> 〇〇システムC機能.bat
echo echo 〇〇システムD機能.bat >> 〇〇システムD機能.bat
echo echo 〇〇システムE機能.bat >> 〇〇システムE機能.bat
echo echo 〇〇システムF機能.bat >> 〇〇システムF機能.bat
echo echo 〇〇システムG機能.bat >> 〇〇システムG機能.bat
echo echo 〇〇システムH機能.bat >> 〇〇システムH機能.bat
echo echo 〇〇システムI機能.bat >> 〇〇システムI機能.bat
echo echo 〇〇システムJ機能.bat >> 〇〇システムJ機能.bat
echo echo 〇〇システムK機能.bat >> 〇〇システムK機能.bat
echo echo 〇〇システムL機能.bat >> 〇〇システムL機能.bat
echo echo 〇〇システムM機能.bat >> 〇〇システムM機能.bat
echo echo 〇〇システムN機能.bat >> 〇〇システムN機能.bat
echo echo 〇〇システムO機能.bat >> 〇〇システムO機能.bat
echo echo 〇〇システムP機能.cmd >> 〇〇システムP機能.cmd
echo pause >> 〇〇システムA機能.bat
echo pause >> 〇〇システムB機能.bat
echo pause >> 〇〇システムC機能.bat
echo pause >> 〇〇システムD機能.bat
echo pause >> 〇〇システムE機能.bat
echo pause >> 〇〇システムF機能.bat
echo pause >> 〇〇システムG機能.bat
echo pause >> 〇〇システムH機能.bat
echo pause >> 〇〇システムI機能.bat
echo pause >> 〇〇システムJ機能.bat
echo pause >> 〇〇システムK機能.bat
echo pause >> 〇〇システムL機能.bat
echo pause >> 〇〇システムM機能.bat
echo pause >> 〇〇システムN機能.bat
echo pause >> 〇〇システムO機能.bat
echo pause >> 〇〇システムP機能.cmd
```
</div></details>

# 開発環境💻
- OSエディション：Windows 10 Pro
- OSバージョン：20H2
- OSビルド：19042.630
- Powershellバージョン：5.1.18362.1171