🔰PoweShellでフォーム入力

# はじめに
今回はPoweShellを使って「.txt」ファイルを出力します。
定型文を1字1句全部入力するよりも固定文以外の場所だけ入力して時短を図りたい方向けです。

また、ちょっとした選択で出力をアレンジすることも可能としています。

::: note warn
・コードは例文であり任意の文言に変更してください
・コードが書かれたファイルがあるパスを自動的に取得し同じ場所に出力するようにしています。
・色々疑問点はあると思いますが何卒ご容赦ください。
・質問はAIが早くて正確です💦
・解説はコード中の「#」の右側に全部書きました。長いのにさらに解説部分を設けるだなんて読む方のご負担にもなると思いますので💦
:::


ではでは本題に
世の中色々と便利になる一方で制約も多い。

"そんなのExcelで良いじゃん♪"　とか　"○○インストールすれば簡単ですよ♪"
と想像される方が多数だと思います。

でもこの世界　

「デフォルトアプリ以外ダウンロードやインストールは禁止!!」
「うちの会社予算がすくなくて、君のPCだけOffice使えないんだよね。辛抱して」

なんて会社も聞こえてこなかったり、聞こえてきたり…
そんなときに便利なのがデフォルトでインストールされているPoweShellです。




# 目次

・ **1.ps1コード(全文)**
・ **2.実行**
・ **3.動かない時は**


# 1.ps1コード(全文)

```.ps1ファイルのコード


# フォームソフトの宣言、PoweShellを起動しただけではフォームソフト自体が動かないのでロードさせている。
Add-Type -AssemblyName System.Windows.Forms
 
# 変数にまっさらな板の様なフォームの基礎板を格納
$form = New-Object System.Windows.Forms.Form
 
# フォームに表示するタイトルを設定" "内の文字が反映される。
$form.Text = "入力フォーム"
 
# 左側の数値が横幅、右側が縦幅
$form.Size = New-Object System.Drawing.Size(400,350)

 
# 文字を入力する部分の配列宣言
$textboxs = @{}
 
# 文字を入力する左側に表示する文言を配列で作成している。
$labels = @("社内業務用端末", "出張先利用端末", "社員名", "メールアドレス", "携帯電話")
$y = 10
 


# ====================================ラベル作成部分======================================================================================================
 
# ②新しいラベルオブジェクトを作成
$labeCAUTION = New-Object System.Windows.Forms.Label
$labeCAUTION.Text = "@hogehoge.co.jp"
$labeCAUTION.Location = New-Object System.Drawing.Point(250, 102)
# ラベルサイズを指定しないと途中で折返しての表示となるため指定。　　
$labeCAUTION.Size = New-Object System.Drawing.Size(400, 20)
$form.Controls.Add($labeCAUTION)
 
 
# ====================================ラジオボタン作成部分====================================================================================================== 
 
# ラベル名("lables"配列)に対してループ処理を実行。
foreach ($label in $labels) {
    # 新しいラベルオブジェクトを作成
    $labelOBJ = New-Object System.Windows.Forms.Label
    # 作成したラベルは無名の状態のなので配列から1つずつ取り出し名前を設定
    $labelOBJ.Text = $label
    # ラベルを配置する位置を設定Excelで言う列は不動のため"10"としている。
    # 行は変動するため変数"y"とし、1つの処理が終わるごとに設定した行に+30している。
    $labelOBJ.Location = New-Object System.Drawing.Point(10, $y)


    # 上記はあくまで設計・作成までで、ここでやっとフォームへの設置・配置となる。
    $form.Controls.Add($labelOBJ)


# ====================================入力フォーム作成部分======================================================================================================

    # テキストを格納するための箱を準備している。
    $textbox = New-Object System.Windows.Forms.TextBox
    $textbox.Location = New-Object System.Drawing.Point(150, $y)
    # 入力フォームに表札・部屋番号の様な物を設定
    $textbox.Name = $label

    $form.Controls.Add($textbox)
    # どの入力箱がどのラベル、名前の物と認識させればよいのか設定している。
    $textboxs[$label] = $textbox
    # フォームを配置する行は変動しないといけないので1つめで"30"を指定し、2つめの作業からは+30と下に、下に下がっていく様にしている。
    $y += 30
    # 1つの処理が終わったら再度上に戻って次の作業へ
}





# ====================================ラジオボタン作成部分======================================================================================================

# ラジオボタンを配置する土台を作成
# これがないとボタンを配置しても全選択の状態になる。
$MyGroupBox1 = New-Object System.Windows.Forms.GroupBox
$MyGroupBox1.Location = New-Object System.Drawing.Point(150,160)
$MyGroupBox1.size = New-Object System.Drawing.Size(180,70)
$MyGroupBox1.text = "勤務地"

# ラジオボタンの作成ただし、上記のグループより「Size」数値が大きいと非表示になるので注意
# ボタンサイズを大きくしたい場合は上記の「グループ」の「Size」も変更すること。
$RadioButton1 = New-Object System.Windows.Forms.RadioButton
$RadioButton1.Location = New-Object System.Drawing.Point(10,20)
$RadioButton1.size = New-Object System.Drawing.Size(80,20)
$RadioButton1.Checked = $True
$RadioButton1.Text = "本社"

$RadioButton2 = New-Object System.Windows.Forms.RadioButton
$RadioButton2.Location = New-Object System.Drawing.Point(10,45)
$RadioButton2.size = New-Object System.Drawing.Size(100,20)
$RadioButton2.Checked = $False
$RadioButton2.Text = "大阪支社"


# グループ土台にボタンを設置
$MyGroupBox1.Controls.AddRange(@($RadioButton1,$RadioButton2))

# 設置した土台 + ボタンをフォームに追加
$form.Controls.Add($MyGroupBox1)

 

 
$y += 30
 
# 登録ボタンの作成
$button = New-Object System.Windows.Forms.Button
$button.Text = "Submit"
$button.Location = New-Object System.Drawing.Point(150, 270)
$form.Controls.Add($button)
 


# 選択されたラジオボタンの値を取得する関数
function Get-SelectedRadioButtonValue {
    param (
        [Parameter(Mandatory=$true)]

        # 「groupBox」が突然出ているが[]内のシステムプロパティを変数に格納しているだけ
        [System.Windows.Forms.GroupBox]$groupBox
    )
    # 1つ1つ値を確認しTrueとなっている物を探し出す。
    foreach ($control in $groupBox.Controls) {

    # 「$control」に格納した型がラジオボタン型か、さらに値が「true」か確認している。
        if ($control -is [System.Windows.Forms.RadioButton] -and $control.Checked) {
           
            # そしてTrueとなっているラジオボタンの値を「.Text」で格納
            return $control.Text
        }
    }
    return $null
}



# ここでも配列を使う。デフォルト文を配列に格納する場合は「""」で囲むだけで良い
# 入力した値に定型文を結合する場合は「""」で結合する文を作成し「+」で結合を行う。
# ($***["■■■"].Text)と書く。「***」は入力フォームの変数名、「■」は入力するフォームにつけた名前が入る。 
# 入力フォームはあるが、入力した情報を保持する箱がないため箱を作成する。
# ただし、箱に名前を書き、配列化しないとどのフォームに入力した文字をどれに格納するかができないため、設定している。
# 固定文を追加したい場合はここに書く
$button.Add_Click({
    $inputs = @{}
    $inputs["社内業務用端末"] = "Tokyo-Kanri-" + ($textboxs["社内業務用端末"].Text)
    $inputs["出張先利用端末"] = "Tokyo-Kanri-" + ($textboxs["出張先利用端末"].Text)
    $inputs["社員名"] = $textboxs["社員名"].Text
    $inputs["勤務地"] = $selectedLocation = Get-SelectedRadioButtonValue -groupBox $MyGroupBox1
    $inputs["メールアドレス"] = $textboxs["メールアドレス"].Text
　　$inputs["携帯電話"] = $textboxs["携帯電話"].Text　
    $inputs["固定文1"] = "これは固定文1です。"
 
     if ($selectedLocation -eq "本社") {
    $inputs["第2アドレス"] = "$($inputs["メールアドレス"])@honsya.co.jp"
    } elseif ($selectedLocation -eq "大阪支社") {
    $inputs["第2アドレス"] = "$($inputs["メールアドレス"])@oosaka.co.jp"
    }
    $inputs["メールアドレス"] = ($textboxs["メールアドレス"].Text) + "@hogehoge.co.jp"
    


 
    $filename = "$($inputs["社員名"])_" + "$($inputs["社内業務用端末"])_" + "$($inputs["出張先利用端末"]).txt"
    $outputPath = Join-Path (Get-Location) $filename
    # ここで「.txt」ファイルに出力している。「`n」で改行前後に空白は不要
    $content = "社員名: $($inputs["社員名"])`n社内業務用端末: $($inputs["社内業務用端末"])`n自宅利用端末: $($inputs["出張先利用端末"])`n勤務地: $($inputs["勤務地"])`nメールアドレス: $($inputs["メールアドレス"])`n第2アドレス：$($inputs["第2アドレス"])`n携帯電話：$($inputs["携帯電話"])`n固定文挿入：$($inputs["固定文1"])"
    [System.IO.File]::WriteAllText($outputPath, $content)
 
    [System.Windows.Forms.MessageBox]::Show("Data saved to $filename")
    $form.Close()
 })
$form.ShowDialog()

```
# 2.実行
さて上記のコードを実行するには「メモ帳」を開き、コードを貼り付けます。
貼り付け後は保存するのですが、ファイル名は「*** .txt」ではなく、
「***.ps1」で保存をお願いします。

また、「**エンコード**」も「**ANSI**」で設定し保存してください。
保存後はファイルを右クリックして「**PowerShellで実行**」をクリックすると動きます。

# 3.動かない時は
上記の方法で動かない時はもう一つファイルを同じ場所に作成します。
「メモ帳」を開いて下記のコードを貼り付けてください。

「*** .bat」ファイルで「**エンコード**」はまたも「**ANSI**」を指定して保存してください。「***」は任意のファイル名が入ります。

そして作成した「*** .bat」ファイルをダブルクリックで実行して完了です。


```.batのコード
@echo off

rem 「.bat」ファイルがある場所のパスを自動取得
pushd %~dp0

rem 「***.ps1」の「***」部分を上記で作成したファイル名に変更してください。
powershell -Noprofile -ExecutionPolicy Unrestricted .\***.ps1

rem 下記の文言は「続行する場合にはEnterを」と表示するための文言です。
rem 「.bat」を実行してもすぐに消えない様にするためです。
pause
```

<br><br>

 以上です。最後まで閲覧いただきありがとうございました。