我是否可以同时创建/声明多个相同类型的PowerShell对象?

我是否可以同时创建/声明多个相同类型的PowerShell对象?,powershell,Powershell,我有一个PowerShell(5.1版)表单,表单中有各种各样的System.Windows.Forms对象,它们都命名为一些通用的东西,比如$label1,$label2,等等,还有$textBox1,$textBox2,等等 目前,我正在创建表单中显示的每个项目,如下所示: Add-Type -AssemblyName System.Windows.Forms $Form = New-Object system.Windows.Forms.Form $Form | ForEach-Obje

我有一个PowerShell(5.1版)表单,表单中有各种各样的
System.Windows.Forms
对象,它们都命名为一些通用的东西,比如
$label1
$label2
,等等,还有
$textBox1
$textBox2
,等等

目前,我正在创建表单中显示的每个项目,如下所示:

Add-Type -AssemblyName System.Windows.Forms

$Form = New-Object system.Windows.Forms.Form
$Form | ForEach-Object {
    $_.Size = New-Object System.Drawing.Size(800,550)
    $_.StartPosition = 'CenterScreen'
    $_.Text = "Example Form Name"
    $_.Topmost = $true
}

$label1 = New-Object System.Windows.Forms.Label
$label1 | ForEach-Object {
    $_.Location = '10,10'
    $_.Size = '156,20'
    $_.Text = 'Dummy text part 1'
}

$textBox1 = New-Object System.Windows.Forms.TextBox
$textBox1 | ForEach-Object {
    $_.Location = '166,8'
    $_.Size = '100,20'
}

$label2 = New-Object System.Windows.Forms.Label
$label2 | ForEach-Object {
    $_.Location = '267, 10'
    $_.Size = '85,20'
    $_.Text = 'Dummy text part 2'
}

$textBox2 = New-Object System.Windows.Forms.TextBox
$textBox2 | ForEach-Object {
    $_.Location = '352,8'
    $_.Size = '100,20'
}

#A lot more lines of similar code go here

$Form.Controls.Add($label1)
$Form.Controls.Add($textBox1)
$Form.Controls.Add($label2)
$Form.Controls.Add($textBox2)

$result = $Form.ShowDialog()
我有几十个这样的对象,我正在根据这个方案创建和命名,我真的想通过在每一行上创建所有这些对象来保存一些行(例如,在一行上创建所有
标签,然后在一行上创建所有
文本框
es),或者至少在每一行上创建一个方法/函数

我试过这个:

$label1, $label2, $label3 = New-Object System.Windows.Forms.Label
而不是在上面的完整演示表单中声明每个
$label
,但是PowerShell似乎不是这样工作的;它只创建
$label1
(这本身很奇怪;如果它只在其中一个上工作,我本以为它只会创建
$label3
),PowerShell ISE稍后会为
$label2
$label3
的属性声明抛出一个错误:

The property 'Location' cannot be found on this object. Verify that the property exists and can be set. At <filepath>.ps1:43 char:5 + $_.Location = '267, 10' + ~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (:) [], RuntimeException + FullyQualifiedErrorId : PropertyNotFound 在此对象上找不到属性“Location”。验证该属性是否存在并可以设置。 在ps1:43字符:5 +$\位置='267,10' + ~~~~~~~~~~~~~~~~~~~~~~~ +CategoryInfo:InvalidOperation:(:)[],运行时异常 +FullyQualifiedErrorId:PropertyNotFound ……等等


有没有一种方法可以一次性创建多个具有递增后缀的相同类型的对象,而不是在各自的行中声明它们,或者我一直在写这些,我现在是如何得到它们的?

多重赋值将赋值右边的数组元素赋给左边的变量<代码>新对象本身不允许一次创建多个对象。您可以编写一个循环或函数,生成一个标签数组,然后使用多重赋值将该数组的元素分配给变量

$label1, $label2, $label3 = 1..3 | ForEach-Object {
    New-Object Windows.Forms.Label
}

但是,我认为更好的方法是编写一个函数,用给定的参数创建一个label对象,然后将该函数的输出分配给一个变量

function New-Label {
    [CmdletBinding()]
    Param(
        [Parameter(Mandatory=$true)]
        [string]$Location,
        [Parameter(Mandatory=$true)]
        [string]$Size,
        [Parameter(Mandatory=$false)]
        [string]$Text = ''
    )

    $o = New-Object Windows.Forms.Label
    $o.Location = $Location
    $o.Size     = $Size
    $o.Text     = $Text

    return $o
}

$label1 = New-Label -Location '10,10' -Size '156,20' -Text 'Dummy text part 1'
$label2 = New-Label -Location '267,10' -Size '85,20' -Text 'Dummy text part 2'
$label3 = ...
您也可以直接将标签添加到表单中,而不是首先将其分配给变量:

$Form.Controls.Add((New-Label '10,10' '156,20' 'Dummy text part 1'))
$Form.Controls.Add((New-Label '267,10' '85,20' 'Dummy text part 2'))
$Form.Controls.Add((New-Label ...))
注意,当MatrJoshing(嵌套)函数调用到方法调用中时,需要围绕函数调用对表达式进行分组。因此有两组括号


当然,
新标签
可以进一步改进,例如,对于
$Location
$Size
使用整数数组而不是字符串。或者,为
$Top
$Left
$Width
$Height
设置另一个参数,并根据使用的参数集分配值。参数也应该进行验证。依此类推。

多重赋值将赋值右边的数组元素赋值给左边的变量<代码>新对象本身不允许一次创建多个对象。您可以编写一个循环或函数,生成一个标签数组,然后使用多重赋值将该数组的元素分配给变量

$label1, $label2, $label3 = 1..3 | ForEach-Object {
    New-Object Windows.Forms.Label
}

但是,我认为更好的方法是编写一个函数,用给定的参数创建一个label对象,然后将该函数的输出分配给一个变量

function New-Label {
    [CmdletBinding()]
    Param(
        [Parameter(Mandatory=$true)]
        [string]$Location,
        [Parameter(Mandatory=$true)]
        [string]$Size,
        [Parameter(Mandatory=$false)]
        [string]$Text = ''
    )

    $o = New-Object Windows.Forms.Label
    $o.Location = $Location
    $o.Size     = $Size
    $o.Text     = $Text

    return $o
}

$label1 = New-Label -Location '10,10' -Size '156,20' -Text 'Dummy text part 1'
$label2 = New-Label -Location '267,10' -Size '85,20' -Text 'Dummy text part 2'
$label3 = ...
您也可以直接将标签添加到表单中,而不是首先将其分配给变量:

$Form.Controls.Add((New-Label '10,10' '156,20' 'Dummy text part 1'))
$Form.Controls.Add((New-Label '267,10' '85,20' 'Dummy text part 2'))
$Form.Controls.Add((New-Label ...))
注意,当MatrJoshing(嵌套)函数调用到方法调用中时,需要围绕函数调用对表达式进行分组。因此有两组括号

当然,
新标签
可以进一步改进,例如,对于
$Location
$Size
使用整数数组而不是字符串。或者,为
$Top
$Left
$Width
$Height
设置另一个参数,并根据使用的参数集分配值。参数也应该进行验证。等等等等。

这个

$label1, $label2, $label3 = New-Object System.Windows.Forms.Label
…创建一个新的
标签
,并将其分配给
$label1
。没有为
$label2
$label3
分配任何值,因为右侧没有更多值可分配给它们。如果该语法确实分配了所有三个变量,那么它们(很可能)都包含相同的
标签
实例,无论如何,这对您的用例不起作用

相反,要实例化三个
标签
实例并将它们分配给执行此操作所需的三个变量

$label1, $label2, $label3 = (New-Object System.Windows.Forms.Label), (New-Object System.Windows.Forms.Label), (New-Object System.Windows.Forms.Label)
…可以简化为

$label1, $label2, $label3 = 1..3 | ForEach-Object -Process { New-Object System.Windows.Forms.Label }
$label1, $label2, $label3 = 1..3 | % { New-Object System.Windows.Forms.Label }
…可以简化为

$label1, $label2, $label3 = 1..3 | ForEach-Object -Process { New-Object System.Windows.Forms.Label }
$label1, $label2, $label3 = 1..3 | % { New-Object System.Windows.Forms.Label }
这个

$label1, $label2, $label3 = New-Object System.Windows.Forms.Label
…创建一个新的
标签
,并将其分配给
$label1
。没有为
$label2
$label3
分配任何值,因为右侧没有更多值可分配给它们。如果该语法确实分配了所有三个变量,那么它们(很可能)都包含相同的
标签
实例,无论如何,这对您的用例不起作用

相反,要实例化三个
标签
实例并将它们分配给执行此操作所需的三个变量

$label1, $label2, $label3 = (New-Object System.Windows.Forms.Label), (New-Object System.Windows.Forms.Label), (New-Object System.Windows.Forms.Label)
…可以简化为

$label1, $label2, $label3 = 1..3 | ForEach-Object -Process { New-Object System.Windows.Forms.Label }
$label1, $label2, $label3 = 1..3 | % { New-Object System.Windows.Forms.Label }
…可以简化为

$label1, $label2, $label3 = 1..3 | ForEach-Object -Process { New-Object System.Windows.Forms.Label }
$label1, $label2, $label3 = 1..3 | % { New-Object System.Windows.Forms.Label }

这个代码直接来自于这个问题。它不会在我的系统Windows 10上的PowerShell v5.1.17763.316上引发错误<代码>$x,$y,$z=1..2
也不会抛出错误,因为每个变量都包含(或不包含)预期值。@我应该注意,我正在PowerShell ISE中运行代码(Ansgar也可能是)。VS代码或PowerShell.exe可能不显示错误;我还没查过。ISE将抛出错误,并且仍然