您好我正在尝试在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"因为它是数组中的最后一个元素;有没有办法更改脚本,使每个按钮只打开他们各自的文件,而不是最后一个颜色文件?
如果需要进一步的问题或说明,请告诉我。
答案 0 :(得分:2)
看起来问题是Add_Click行。脚本块包含指向变量$ color的链接,而不是立即对其进行评估以创建新的"记事本..." Invoke-Expression的字符串并链接到该字符串。单击按钮时将创建Invoke-Expression的字符串。此时,$ color为白色,因为循环已完成,因此所有按钮最终都会使用White创建一个字符串。
你可以通过调用GetNewClosure()来修复它,它将构建导致在循环期间创建Invoke-Expression的字符串,而不是在单击按钮时创建。因此,将行更改为:
$run.Add_Click({ Invoke-Expression "notepad C:\Users\User\$color.txt" }.GetNewClosure())
它应该按预期工作。