PowerShell で Base64 エンコード・デコードする

インターネットに繋がらない環境で気軽に Base64 エンコード・デコードしたい。
なんなら GUI で行いたいと思い作成。

前提条件

  • Windows 10 Professional
  • $PSVersionTable PSVersion=5.1.15063.1387
  • ファイルを選択し右クリック → PowerShell で実行

base64_gui_app.ps1

Add-Type -AssemblyName PresentationFramework
Add-Type -AssemblyName System.Windows.Forms

$xaml = @'
<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    Title="Base64_GUI_App" Width="1024" Height="600">

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>

        <Label Content="Input" Grid.Row="0" Grid.Column="0" />
        <TextBox Name="InputTextBox" Grid.Row="1" Grid.Column="0" AcceptsReturn="True" TextWrapping="Wrap" VerticalScrollBarVisibility="Auto" />

        <Label Content="Output" Grid.Row="0" Grid.Column="1" />
        <TextBox Name="OutputTextBox" Grid.Row="1" Grid.Column="1" AcceptsReturn="True" TextWrapping="Wrap" VerticalScrollBarVisibility="Auto" />

        <StackPanel Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="2" Orientation="Horizontal">
            <Button Name="EncodeButton" Margin="3" Padding="5" Content="Encode" />
            <Button Name="DecodeButton" Margin="3" Padding="5" Content="Decode" />
            <Button Name="CopyToClipboardFromOutputButton" Margin="3" Padding="5" Content="Copy to clipboard from output" />
            <Button Name="ClearButton" Margin="3" Padding="5" Content="Clear" />
        </StackPanel>
    </Grid>
</Window>
'@

$frm = [System.Windows.Markup.XamlReader]::Parse($xaml)

$frm.FindName("EncodeButton").Add_Click({

    $str = $frm.FindName("InputTextBox").Text

    $byte = [System.Text.Encoding]::GetEncoding("shift_jis").GetBytes($str)
    $base64 = [System.Convert]::ToBase64String($byte)

    $frm.FindName("OutputTextBox").Text = $base64
})

$frm.FindName("DecodeButton").Add_Click({

    $base64 = $frm.FindName("InputTextBox").Text

    $byte = [System.Convert]::FromBase64String($base64)
    $str = [System.Text.Encoding]::GetEncoding("shift_jis").GetString($byte)

    $frm.FindName("OutputTextBox").Text = $str
})

$frm.FindName("CopyToClipboardFromOutputButton").Add_Click({

    # Change to SJIS
    $OutputEncoding = [Console]::OutputEncoding
    $frm.FindName("OutputTextBox").Text | Clip
})

$frm.FindName("ClearButton").Add_Click({

    $frm.FindName("InputTextBox").Clear()
    $frm.FindName("OutputTextBox").Clear()
})

$frm.FindName("InputTextBox").Focus()

$primaryScreen = [System.Windows.Forms.Screen]::PrimaryScreen
$frm.Top  = ($primaryScreen.Bounds.Height / 2) - ($frm.Height / 2)
$frm.Left = ($primaryScreen.Bounds.Width  / 2) - ($frm.Width  / 2)
$frm.ShowDialog()

確認

f:id:kameya_takefumi:20190404153849p:plain

PowerShellGUI もいけるので、本当に凄い。
スクリプト言語の軽さで、これは強みだと思う。