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