我正在尝试编写一个包含列表框的PowerShell脚本.为了确保我已经掌握了所需的概念,我在TechNet上查找了一个教程并试图复制所提供的代码.
http://technet.microsoft.com/en-us/library/ff730949.aspx
如果我正确地遵循演练和脚本,则看起来该脚本旨在显示一个对话框,然后将所选项目输出到CLI.我已经复制了对话框,但我无法将选择内容写入CLI.我甚至修改了最后一行来显式调用Write-Output来显示$ x的值.
除了为$ x实际写出任何值之外,关于此脚本的所有内容似乎都按预期工作.由于echo "$x"可能是所有代码中最简单的一行,我只能假设问题实际上是将数据写入 $ x.
下面是我的PowerShell ISE窗口的剪切和粘贴,后者又从上述TechNet文章中剪切并粘贴:
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
$objForm = New-Object System.Windows.Forms.Form
$objForm.Text = "Select a Computer"
$objForm.Size = New-Object System.Drawing.Size(300,200)
$objForm.StartPosition = "CenterScreen"
$objForm.KeyPreview = $True
$objForm.Add_KeyDown({if ($_.KeyCode -eq "Enter")
{$x=$objListBox.SelectedItem;$objForm.Close()}})
$objForm.Add_KeyDown({if ($_.KeyCode -eq "Escape")
{$objForm.Close()}})
$OKButton = New-Object System.Windows.Forms.Button
$OKButton.Location = New-Object System.Drawing.Size(75,120)
$OKButton.Size = New-Object System.Drawing.Size(75,23)
$OKButton.Text = "OK"
$OKButton.Add_Click({$x=$objListBox.SelectedItem;$objForm.Close()})
$objForm.Controls.Add($OKButton)
$CancelButton = New-Object System.Windows.Forms.Button
$CancelButton.Location = New-Object System.Drawing.Size(150,120)
$CancelButton.Size = New-Object System.Drawing.Size(75,23)
$CancelButton.Text = "Cancel"
$CancelButton.Add_Click({$objForm.Close()})
$objForm.Controls.Add($CancelButton)
$objLabel = New-Object System.Windows.Forms.Label
$objLabel.Location = New-Object System.Drawing.Size(10,20)
$objLabel.Size = New-Object System.Drawing.Size(280,20)
$objLabel.Text = "Please select a computer:"
$objForm.Controls.Add($objLabel)
$objListBox = New-Object System.Windows.Forms.ListBox
$objListBox.Location = New-Object System.Drawing.Size(10,40)
$objListBox.Size = New-Object System.Drawing.Size(260,20)
$objListBox.Height = 80
[void] $objListBox.Items.Add("atl-dc-001")
[void] $objListBox.Items.Add("atl-dc-002")
[void] $objListBox.Items.Add("atl-dc-003")
[void] $objListBox.Items.Add("atl-dc-004")
[void] $objListBox.Items.Add("atl-dc-005")
[void] $objListBox.Items.Add("atl-dc-006")
[void] $objListBox.Items.Add("atl-dc-007")
$objForm.Controls.Add($objListBox)
$objForm.Topmost = $True
$objForm.Add_Shown({$objForm.Activate()})
[void] $objForm.ShowDialog()
echo "$x"
Run Code Online (Sandbox Code Playgroud)
当上述内容无法按预期工作时,我决定逐步完成本教程并自行重新编写脚本.我修改了一下以更好地适应我的组织偏好并在此过程中添加注释.但是,现在甚至对话本身也被打破了.
# Load Windows Forms & Drawing classes.
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
# Create base form.
$objForm = New-Object System.Windows.Forms.Form
$objForm.Text = "Select a Computer"
$objForm.Size = New-Object System.Drawing.Size(300,200)
$objForm.StartPosition = "CenterScreen"
# Configure keyboard intercepts for ESC & ENTER.
$objForm.KeyPreview = $true
$objForm.Add_KeyDown({
if ($_.KeyCode -eq "Enter")
{
$x = $objListBox.SelectedItem
$objForm.Close()
}
})
$objForm.Add_KeyDown({
if ($_.KeyCode -eq "Escape")
{
$objForm.Close()
}
})
# Create OK button.
$OKButton = New-Object System.Windows.Forms.Button
$OKButton.Location = New-Object System.Drawing.Size(75,120)
$OKButton.Size = New-Object System.Drawing.Size(75,23)
$OKButton.Text = "OK"
$OKButton.Add_Click({
$x = $objListBox.SelectedItem
$objForm.Close()
})
$objForm.Controls.Add($OKButton)
# Create Cancel button.
$CancelButton = New-Object System.Windows.Forms.Button
$CancelButton.Location = New-Object System.Drawing.Size(150,120)
$CancelButton.Size = New-Object System.Drawing.Size(75,23)
$CancelButton.Text = "Cancel"
$CancelButton.Add_Click({
$objForm.Close()
})
$objForm.Controls.Add($CancelButton)
# Add form prompt text.
$objLabel = New-Object System.Windows.Forms.Label
$objLabel.Location = New-Object System.Drawing.Size(10,20)
$objLabel.Text = "Please select a computer:"
$objForm.Controls.Add($objLabel)
# Add list box.
$objListBox = New-Object System.Windows.Forms.ListBox
$objListBox.Location = New-Object System.Drawing.Size(10,40)
$objListBox.Size = New-Object System.Drawing.Size(260,20)
$objListBox.Height = 80
# Populate list.
[void] $objListBox.Items.Add("Option1")
[void] $objListBox.Items.Add("Option2")
[void] $objListBox.Items.Add("Option3")
[void] $objListBox.Items.Add("Option4")
[void] $objListBox.Items.Add("Option5")
[void] $objListBox.Items.Add("Option6")
[void] $objListBox.Items.Add("Option7")
# Force list box to display on top of other windows.
$objForm.TopMost = $true
# Display list box.
$objForm.Add_Shown({
$objForm.Activate()
})
[void] $objForm.ShowDialog()
# Show result.
$x
Run Code Online (Sandbox Code Playgroud)
第二个代码块导致:

我做错了什么,在这里?
注意:我在Windows 7上运行PowerShell 3.0
获取列表框功能的简单方法是使用Out-GridView.例如:
'one','two','three','four' | Out-GridView -OutputMode Single
Run Code Online (Sandbox Code Playgroud)
用户可以选择一个项目,它将在管道中返回.
您还可以-OutputMode Multiple用于多选.
另一个例子:
get-process | Out-GridView -OutputMode Multiple
Run Code Online (Sandbox Code Playgroud)

这将返回所选对象:
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
396 24 5008 8964 113 8,88 3156 AuthManSvr
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
20059 次 |
| 最近记录: |