Powershell为winforms对象设置变量

e1xvtsh3  于 2023-10-18  发布在  Shell
关注(0)|答案(2)|浏览(97)

我正在尝试为winform对象定义变量:$Textbox_serverDNS1、$Textbox_serverDNS2、$Textbox_serverDNS3

我尝试使用这个语法,但它现在工作:

for ($i=1; $i -le 3; $i++){
        Set-Variable -Name "TextBox_ServerDNS$($i)" -Value (New-Object -TypeName System.Windows.Forms.TextBox -Property @(Text = "10.10.10.$i")) -Scope Global
    }

你知道我该怎么定义它吗
谢谢,

flvlnr44

flvlnr441#

唯一需要修复的命令是将-Property @(Text = "10.10.10.$i")替换为-Property @{ Text = "10.10.10.$i" },即你需要传递一个带有属性 name-value pairshashtable@{ ... }),而不是一个 array@(...)

  • New-Object-Property参数显示为IDictionary(-interface)类型,这意味着必须传递一个类似于 dictionary-like 的对象(如[hashtable]示例)。

但是,您可以简化您的方法,如下所示:

Add-Type -AssemblyName System.Windows.Forms

1..3 | ForEach-Object {
  Set-Variable -Scope Global -Name "TextBox_ServerDNS$_" -Value (
    [System.Windows.Forms.TextBox] @{ Text = "10.10.10.$_" }
  )
}

请注意将哈希表转换为目标类型的方便功能,这隐式地构造了一个示例(假设是一个无参数的构造函数),并根据哈希表的条目修改其属性。

退一步

  • 一般来说,最好 * 避免 * 全局变量,因为它们是 session-global,即即使在脚本退出后,它们也会继续存在。
    ***而不是创建 * 单个变量 *,最好构造一个存储示例的 * 数组 * 变量 *;下面的示例使用$script:作用域而不是全局作用域:
Add-Type -AssemblyName System.Windows.Forms

# You can use indexing to access the individual text boxes later, 
# e.g. $textBoxArray[0]
$script:textBoxArray = 
  1..3 | ForEach-Object { [System.Windows.Forms.TextBox] @{ Text = "10.10.10.$_" } }

更新

  • 事实证明,您真正的意图是更改 * 现有 * TextBox示例的文本。
  • 这需要使用Get-Variable来间接检索变量值,如下所示。
1..3 | ForEach-Object {
  (Get-Variable -ValueOnly -Name "TextBox_ServerDNS$_").Text = "10.10.10.$_"
}
9w11ddsr

9w11ddsr2#

这样的怎么样?

add-type -assembly presentationframework
1..3 | foreach-object {
  set-variable "TextBox_ServerDNS$_" $(
    $box = [windows.controls.textbox]::new()
    $box.text = "10.10.10.$_"
    $box
  )
}

我会仔细检查,以确保你加载的是正确的类型/程序集。

相关问题