【发布时间】:2021-01-20 21:22:41
【问题描述】:
TLDR: 如何生成生成的变量,然后稍后在 Add_click 中调用该变量。 我确信我需要对每个对象/按钮进行某种序列化。
我正在构建一个从 csv 读取数据以创建按钮和功能的小工具。
csv 看起来像
Name Type Link Script
Powershell App C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe Empty
FixXYZ Fix Empty -ScriptStuffHere-
然后该工具将创建一个带有名称的按钮(正在进行过滤应用程序和修复程序),当您单击该按钮时,如果它的应用程序将执行 start ($link) 并且如果它的修复程序将运行脚本。
我的问题是我让它制作按钮并给它们命名,按钮的名称保持不变,但功能没有。
完整代码:
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName PresentationFramework
[System.Windows.Forms.Application]::EnableVisualStyles()
#=======================================================
$Form = New-Object system.Windows.Forms.Form
$Form.text = "Form"
$Form.TopMost = $false
$Form.ClientSize = New-Object System.Drawing.Point(760,400)
$Form.minimumSize = New-Object System.Drawing.Size(760,400)
$Form.maximumSize = New-Object System.Drawing.Size(760,400)
$GetCSV = import-csv "C:\File.csv"
$Details = $GetCSV.Name
$DeviceList = $GetCSV
$Count = $DeviceList.Lines.Count
$ObjectNumber = -1
Write-Host "Total Entries:" $Count
$x = 0 #up down
$z = 0 #left right
$Names = @($DeviceList.Lines)
$Names | ForEach-Object{
$ObjectNumber += 1
Write-Host "Object:" $ObjectNumber
$x += 0
$z += 120
if($z -eq 720){
$x += 120
$z = 0
Write-Host "New Row"}
Write-Host "x" $x
Write-Host "z" $z
$ButtonLabel = ($GetCSV[$ObjectNumber]).Name
set-Variable -Name "var$ObjectNumber" -Value ($GetCSV[$ObjectNumber] | Select Name, Type, Link, Script, File, FileSource)
Write-Host "Name: " (Get-Variable -Name "var$ObjectNumber" -ValueOnly).Name
Write-Host "Type: " (Get-Variable -Name "var$ObjectNumber" -ValueOnly).Type
Write-Host "Link: "(Get-Variable -Name "var$ObjectNumber" -ValueOnly).Link
Write-Host "Script: "(Get-Variable -Name "var$ObjectNumber" -ValueOnly).Script
Write-Host "File: "(Get-Variable -Name "var$ObjectNumber" -ValueOnly).File
Write-Host =========================
$_ = New-Object system.Windows.Forms.Button
$_.text = $ButtonLabel
$_.width = 100
$_.height = 100
$_.location = New-Object System.Drawing.Point($z,$x)
$_.Font = New-Object System.Drawing.Font('Microsoft Sans Serif',10)
$_.Add_Click({ Start (Get-Variable -Name "var$ObjectNumber" -ValueOnly).Link})
$Form.Controls.Add($_)
}
[void]$Form.ShowDialog()
我很确定我的问题来自
$_.Add_Click({Start (Get-Variable -Name "var$ObjectNumber" -ValueOnly).Link})
我知道问题出在 $ObjectNumber 上,因为每次通过 ForEach 时该数字都会增加 +1,因此当我单击一个按钮时,它会将“var$OjbectNumber”作为其最后一个数字。单击按钮有效,但所有按钮都会打开最后一个条目链接。
【问题讨论】:
-
那个文件真的是这样吗???如果是这样,那不是格式正确的 Csv,您也没有在 Import-Csv 工作中指定分隔符。您没有处理多个空格等。这个
$DeviceList.Lines.Count无效,The property 'Lines' cannot be found on this object. Verify that the property exists.这个$x += 0,也永远不会被设置。只是好奇。但是,当您可以通过函数名调用 WPF/XAML 和点源代码文件时,为什么要使用 CSV?您还有其他错误。由于上述和使用的逻辑,那个 addClick 也是错误的。
标签: winforms powershell