PowerShell 2到PowerShell 3中的阵列行为差异

PowerShell 2到PowerShell 3中的阵列行为差异,powershell,powershell-2.0,powershell-3.0,Powershell,Powershell 2.0,Powershell 3.0,我观察到PowerShell 2.0代码和3.0代码在行为上存在差异,但似乎无法修复。我希望能得到一些帮助。请参阅下面的代码。 如果您在V2中运行此功能(请将ServerA和ServerB更改为网络上的服务器),您将在选择并单击按钮后看到,write host将它们显示为单独的名称。在版本3中,列表框将其填充为1 $Servers = @() [array]$ServerstoPing = ("ServerA","ServerB") # Generate the form

我观察到PowerShell 2.0代码和3.0代码在行为上存在差异,但似乎无法修复。我希望能得到一些帮助。请参阅下面的代码。 如果您在V2中运行此功能(请将ServerA和ServerB更改为网络上的服务器),您将在选择并单击按钮后看到,write host将它们显示为单独的名称。在版本3中,列表框将其填充为1

$Servers = @()
[array]$ServerstoPing = ("ServerA","ServerB")



    # Generate the form
    Add-Type -AssemblyName System.Windows.Forms 
    $Form1 = New-Object system.Windows.Forms.Form
    $Form1.Text = "Ping Some Servers"
    $Font = New-Object System.Drawing.Font("Calibri",18,[System.Drawing.FontStyle]::regular)
    $Fontboxes = New-Object System.Drawing.Font("Lucida Sans",8,[System.Drawing.FontStyle]::regular)
    $Fontdate = New-Object System.Drawing.Font("Lucida Sans",11,[System.Drawing.FontStyle]::bold)
    $FontProgress = New-Object System.Drawing.Font("Lucida Sans",11,[System.Drawing.FontStyle]::bold)
    $Form1.Font = $Font


    $Serverlistbox = New-Object System.Windows.Forms.Listbox
    $Serverlistbox.Location = New-Object System.Drawing.Size(11,137) 
    $Serverlistbox.Size = New-Object System.Drawing.Size(200,170) 
    $Serverlistbox.SelectionMode = "MultiExtended"
    $Serverlistbox.font = $Fontboxes
    foreach($item in $ServerstoPing){
        [void] $Serverlistbox.Items.Add("$item")
        }
    $Form1.Controls.Add($Serverlistbox)

    $SubmitButton = New-Object System.Windows.Forms.button
    $SubmitButton.text = "Ping Servers"
    $SubmitButton.Location = New-Object System.Drawing.Size(171,305)
    $SubmitButton.AutoSize = $True
    $Form1.Controls.Add($SubmitButton)
    $Form1.StartPosition = "CenterScreen"

    $OutputPing = New-Object System.Windows.Forms.TextBox
    $OutputPing.MultiLine = $True
    $OutputPing.ScrollBars = "Vertical"
    $OutputPing.text = "Server ping status will be displayed here once done'."
    $OutputPing.font = $Fontboxes
    $OutputPing.Location = New-Object System.Drawing.Size(226,40)
    $OutputPing.Size = New-Object System.Drawing.Size(200,255)
    $Form1.Controls.Add($OutputPing)




$SubmitButton.add_click({    
#foreach ($objItem in $ServerstoPing)
    foreach ($objItem in $Serverlistbox.SelectedItems)
        {
        $Servers += $objItem
        }

write-host $ServerstoPing

    Foreach($server in $servers)
        {
       ping -n 1 -w 1000 $server | out-null
       if($? -eq $true){
            write-host ("$server ping success")
       } 
       else 
          {
          write-host ("$server did not respond to ping, not extracting events")
       }
        }

       })
$Form1.ShowDialog()         

是的。对不起,这是早些时候宣布的。这是一段相当长的代码。我已经声明了这个变量,我已经添加了完整的代码作为示例,可以复制和粘贴。Thanks@ADTJOB
$servers=@()
应该在事件处理程序中。我宁愿使用
$servers=@($Serverlistbox.SelectedItems)
,然后循环添加数组。@PetSerAl-谢谢。你知道在2.0和3.0之间发生了什么变化吗?@ADTJOB许多事情都发生了变化,尽管我可以指出两个特别的事情,它们使你的代码工作方式不同:1)作为委托调用的
ScriptBlock
在v3+
&{$a=1;([Func[object]]{$a=2;$a}.Invoke();$a}
中创建新的作用域。2) 复合赋值在v3+
和{$a=1;&{$a+=2;$a};$a}
中的工作方式不同(IMHO bug)。