PowerGUI での Read-Host の戻り値の問題 [PowerShell]
$myInvocation の値が正しく設定されていない以外に、
PowerGUI に問題点がもうひとつありました。
PowerGUI で Read-Host が実行されると普通のコンソールのようにコマンドラインで値を受け付けるのではなく、ダイアログボックスが出てきて入力をうながします。
ここで入力欄に値をなにも入れずにそのままOKをクリックすると戻り値が $null になってしまいます。
普通にコンソールで実行している際には $null ではなく長さ0の文字列が帰ってきます。
したがって
どちらの問題も
http://powergui.org/
の Discussion で話題に出てはいるけれど、まだ直っていないようです。
PowerGUI に問題点がもうひとつありました。
PowerGUI で Read-Host が実行されると普通のコンソールのようにコマンドラインで値を受け付けるのではなく、ダイアログボックスが出てきて入力をうながします。
ここで入力欄に値をなにも入れずにそのままOKをクリックすると戻り値が $null になってしまいます。
普通にコンソールで実行している際には $null ではなく長さ0の文字列が帰ってきます。
したがって
$str1 = 'abcde'のような判定ではうまく動かなくなってしまい $null かどうかの判定も付け加えなくてはいけません。
$userinput = Read-Host '[' $str1 ']'
if ($userinput -eq '')
{
$input = $userinput
}
どちらの問題も
http://powergui.org/
の Discussion で話題に出てはいるけれど、まだ直っていないようです。
[Winform] フォーム上のコントロールへのアクセス [PowerShell]
Winformで、フォーム上に配置されたコントロールは、
フォームの Controls プロパティ(Control.ControlCollection)に格納されています。
この中の目的のコントロールに名前を指定してアクセスするために PowerShell では次のように書きます。
コントロール名を連想配列のキーとして扱うような記述方法ですね。
(フォーム $this の中の tableLayoutPanelBase という名前(Name プロパティ値)を持つ
コントロールを変数 panel に格納する例です。)
また、たとえばイベントハンドラー(関数やスクリプトブロック)からアクセスしたいようなコントロールは、フォームから順にたどってアクセスするのではなく、作成時などに script スコープの変数に入れておけば、その変数を使ってアクセスすることも可能です。
コントロールを作成する関数内にイベントハンドラースクリプトブロックを記述すれば、local スコープの変数でも見えるのかと思いましたが、そうではないようです。たとえば次のようなスクリプトで、イベントハンドラー($OnShowDialog1)の《記述場所》はコントロールを作成したスコープの内側だとしても、実行時にはそうではないといういうことなのでしょう、おそらく。
フォームの Controls プロパティ(Control.ControlCollection)に格納されています。
この中の目的のコントロールに名前を指定してアクセスするために PowerShell では次のように書きます。
コントロール名を連想配列のキーとして扱うような記述方法ですね。
(フォーム $this の中の tableLayoutPanelBase という名前(Name プロパティ値)を持つ
コントロールを変数 panel に格納する例です。)
$panel = $this.Controls['tableLayoutPanelBase']入れ子になったパネルの上のコントロールへのアクセスは次のように続けて書くこともできます。長いですけど。
$checkBoxMonitor =Controls の要素には、名前ではなく配列のインデックス番号で Controls[0] のようにしてアクセスすることも可能です。
$this.Controls['tableLayoutPanelBase'].Controls['tableLayoutPanelData'].
Controls['checkBoxMonitor']
また、たとえばイベントハンドラー(関数やスクリプトブロック)からアクセスしたいようなコントロールは、フォームから順にたどってアクセスするのではなく、作成時などに script スコープの変数に入れておけば、その変数を使ってアクセスすることも可能です。
コントロールを作成する関数内にイベントハンドラースクリプトブロックを記述すれば、local スコープの変数でも見えるのかと思いましたが、そうではないようです。たとえば次のようなスクリプトで、イベントハンドラー($OnShowDialog1)の《記述場所》はコントロールを作成したスコープの内側だとしても、実行時にはそうではないといういうことなのでしょう、おそらく。
$script:checkBox1 = New-Object System.Windows.Forms.CheckBox
$script:checkBox2 = New-Object System.Windows.Forms.CheckBox
$OnShowDialog1 =
{
$checkBox1.Checked = $This.Tag.prop1
$checkBox1.Checked = $This.Tag.prop2
}
$FormSetting.Add_Shown($OnShowDialog1)