1

こんにちは、pwoershell で動的フォームを作成しようとしています。これは 5 つのボタン (色の名前) を持つフォームで、各ボタンは異なるテキスト ファイルを開きます (赤いボタンをクリックすると、red.txt を開く必要があります。ここでは完全なコード;

スクリプト開始

$var = "Red","Blue","Yellow","Black","White"


$testForm = New-Object System.Windows.Forms.Form
$testForm.Text = "Color List"
$testForm.AutoSize = $True
$testForm.AutoSizeMode = "GrowAndShrink"     

$Font = New-Object System.Drawing.Font("Times New Roman",24, [System.Drawing.FontStyle]::Bold)   
$testForm.Font = $Font


$Label = New-Object System.Windows.Forms.Label
$Label.Text = "Select the Color"
$Label.AutoSize = $True
$testForm.Controls.Add($Label)


$x=100
$y=50
foreach($color in $var)
{
    $run = New-Object System.Windows.Forms.Button
    $run.Location = New-Object System.Drawing.Size($x,$y)
    $run.Size = New-Object System.Drawing.Size(100,50)
    $run.Text = "$Color"
    $run.Add_Click({ Invoke-Expression "notepad C:\Users\User\$color.txt" })
    $testForm.Controls.Add($run)
    $Font = New-Object System.Drawing.Font("Times New Roman",14,[System.Drawing.FontStyle]::Regular)
    $run.font = $Font
    $run.AutoSize = $True
    $y+=50

}
$testForm.ShowDialog()

終了スクリプト

フォームがボタンで開き、すべてのボタンがクリックされると、配列の最後の要素であるため、ファイル「White.txt」を開くまで、すべてがうまくいきました。各ボタンが最後のカラー ファイルではなく、それぞれのファイルのみを開くようにスクリプトを変更する方法はありますか?

さらに質問や説明が必要な場合はお知らせください。

4

1 に答える 1

2

問題は Add_Click 行にあるようです。スクリプト ブロックには、すぐに変数 $color を評価して Invoke-Expression 用の新しい "notepad..." 文字列を作成し、それにリンクするのではなく、変数 $color へのリンクが含まれています。ボタンがクリックされると、Invoke-Expression の文字列が作成されます。この時点で $color は White 'cos ループが終了したため、すべてのボタンは White を使用して文字列を作成することになります。

GetNewClosure() の呼び出しで修正できます。これにより、後でボタンがクリックされたときではなく、ループ中に Invoke-Expression の文字列が作成されます。したがって、行を次のように変更します。

$run.Add_Click({ Invoke-Expression "notepad C:\Users\User\$color.txt" }.GetNewClosure())

そして、期待どおりに動作するはずです。

于 2012-12-13T16:00:55.510 に答える