10
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PowerShell 選択肢GUI表示

Last updated at Posted at 2020-03-16

■概要

PowerShellでGUIの選択肢を表示する方法。
00.png

■環境

  • Windows 8.1 / PowerShell 4.0
  • Windows 10 / PowerShell 7.0

■コード

Add-Type -AssemblyName PresentationFramework

# 画面定義
[xml]$xaml = @'
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  Title="選択"
  Width="300" Height="200" ResizeMode="Noresize">
    <Window.Resources>
        <!-- 共通スタイル定義 -->
        <Style TargetType="RadioButton">
            <Setter Property="Margin" Value="5"/>
        </Style>
        <Style TargetType="Button">
            <Setter Property="Margin" Value="10"/>
            <Setter Property="Width" Value="100"/>
        </Style>
    </Window.Resources>

    <Grid FocusManager.FocusedElement="{Binding ElementName=firstRadio}">
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>

        <StackPanel Name="radiosContainer">
            <TextBlock Text="以下の選択肢から好きな果物を選択してください。" Margin="5"/>
            <RadioButton Content="リンゴ" Name="firstRadio" IsChecked="True"/>
            <RadioButton Content="キウイ"/>
            <RadioButton Content="パイナップル"/>
        </StackPanel>

        <StackPanel Orientation="Horizontal" Grid.Row="1">
            <Button Content="OK" Name="okBtn" IsDefault="True"/>
            <Button Content="キャンセル" Name="cancelBtn" IsCancel="True"/>
        </StackPanel>
    </Grid>
</Window>
'@

$reader = (New-Object System.Xml.XmlNodeReader $xaml)
$window = [Windows.Markup.XamlReader]::Load($reader)

$radios = $window.FindName('radiosContainer')
$okBtn = $window.FindName('okBtn')
$cancelBtn = $window.FindName('cancelBtn')

[string]$script:selectedRadio = ''

# OKボタン押下時の処理
$okBtn.add_Click.Invoke({
    foreach ($item in $radios.Children) {
        if ([string]$item.GetType() -ne 'System.Windows.Controls.RadioButton') {
            continue
        }
        if ($item.IsChecked) {
            # 選択されたラジオボタンのContentを保存
            $script:selectedRadio = $item.Content
            break
        }
    }
  # ウィンドウを閉じる
  $window.Close()
})

# キャンセルボタン押下時の処理
$cancelBtn.add_Click.Invoke({
  # ウィンドウを閉じる
  $window.Close()
})

# ウィンドウ表示
$window.ShowDialog() > $null

# 結果表示
if ($selectedRadio) {
    Write-Host "${selectedRadio}が選択されました。"
} else {
    Write-Host "キャンセルされました。"
}

■実行イメージ

01.png

ラジオボタンを選択し、OKボタンを押すと選択したものが表示される。
02.png

■補足

CUIでやる場合は$Host.UI.PromptForChoice

10
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?