Я довольно новичок в PowerShell и в настоящее время не могу найти другого (лучше?) Решение по следующей проблеме:
Это мой код: (контрольный пример)
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
function Add-Item ([string]$fItem) {
Write-Host "Do black magic with $fItem here"
}
$MyListOfItems=@()
$MyListOfItems+="foo"
$MyListOfItems+="bar"
$MyListOfItems+="foobar"
$MyListOfItems+="barfoo"
$MyListOfItems+="boofar"
$Form = New-Object System.Windows.Forms.Form
$Form.AutoSize = $True
$Form.AutoSizeMode = "GrowAndShrink"
$Form.Add_Shown({$Form.Activate()})
$Counter=0
ForEach ($Item in $MyListOfItems) {
$AddButton = New-Object System.Windows.Forms.Button
$AddButton.Size = New-Object System.Drawing.Size(100,23)
$AddButton.Location = New-Object System.Drawing.Point(10,(10+25*$Counter))
$AddButton.Text = $Item
#$Command = "Add-Item $Item"
#$AddButton.Add_Click({ Invoke-Expression -command $Command }.GetNewClosure())
$AddButton.Add_Click({ Add-Item $Item }.GetNewClosure())
#$AddButton.Add_Click({ Add-Item $Item })
$Form.Controls.Add($AddButton)
$Counter++
}
[void]$Form.ShowDialog()
В PowerShell ISE он отлично работает:
Do black magic with foo here
Do black magic with bar here
Do black magic with foobar here
Do black magic with barfoo here
Do black magic with boofar here
С другой стороны, когда я запускаю его с Powershell.exe (читай: контекстное меню «Запуск с Powershell»), я получаю сообщение об ошибке на каждой из кнопок:
Add-Item : The term 'Add-Item' is not recognized as the name of a cmdlet, function, script file, or operable program.
Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
At C:\Scripts\buttontest.ps1:62 char:24
+ $AddButton.Add_Click({ Add-Item $Item }.GetNewClosure())
+ ~~~~~~~~
+ CategoryInfo : ObjectNotFound: (Add-Item:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
Если я изменю событие Add_Click для кнопки на:
$AddButton.Add_Click({ Add-Item $Item })
Я не получаю сообщение об ошибке, но прихожу к типичной ловушке - возвращать только последний элемент для каждой нажатой кнопки:
Do black magic with boofar here
Do black magic with boofar here
Do black magic with boofar here
Do black magic with boofar here
Do black magic with boofar here
Мне удалось заставить это работать, изменив область действия функции на глобальную область. Хотя это работает, это не устраивает меня. Модифицированная функция:
function global:Add-Item ([string]$fItem) {
Write-Host "Do black magic with $fItem here"
}
Есть ли способ заставить этот код работать, избегая использования глобальной области для моей функции? Я искал несколько форумов и нашел много тем о различных способах реализации события add_click и различиях между Powershell ISE и командной строкой, но не смог найти ответ между ними
Примечание. Хотя я разрабатываю это в среде PowerShell 3, это все равно должно быть совместимо с PowerShell 2.
Заранее спасибо, Вим.