2013-08-13 2 views
1

목록 상자가 포함 된 PowerShell 스크립트를 작성하려고합니다. 필요한 개념을 마음껏 감싸기 위해 TechNet에서 자습서를 찾아 제공된 코드를 복제하려고했습니다.PowerShell에서 목록 상자 만들기

http://technet.microsoft.com/en-us/library/ff730949.aspx

나는 연습하고 적절하게 스크립트를 다음과 같은거야 경우, 스크립트가 CLI에 대한 대화 상자가 다음 출력 선택한 항목을 제시하기위한 것입니다 것으로 보인다. 대화 상자를 복제했지만 CLI에 선택 사항을 쓰지 못합니다. Write-Output을 명시 적으로 호출하여 $ x 값을 표시하도록 마지막 줄을 수정하기까지했습니다.

실제로이 스크립트에 대한 모든 내용은 $ x의 값을 실제로 작성하는 경우를 제외하고는 의도 한대로 작동하는 것으로 보입니다. echo "$x"은 아마도 모든 코드에서 가장 단순한 코드 일 것입니다. 문제는 실제로 데이터를 가져 오는 것입니다. 대신을 $ x로 작성했습니다. 다음은

는 잘라 내기 및 붙여 넣기 차례로 잘라 내기 및 붙여 넣기 된 상기 TechNet 문서에서 내 PowerShell을 ISE 창에서된다, 예상대로

[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" 

는 위의 방법으로 문제가 해결되지 않은 I 자습서와 함께 단계별로 가서 직접 스크립트를 다시 작성하기로 결정했습니다. 내 조직의 환경 설정에 더 잘 어울리고 주석을 추가하기 위해 약간 수정했습니다. 그러나 이제는 대화 상자 자체가 손상되었습니다. 이에

# 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 

두 번째 코드 블록 결과 : 여기, 잘못하고있는 무슨

Broken list box

?

참고 : 나는 윈도우 7

답변

1

에 PowerShell을 3.0을 실행하고있어 이에 대한 확인 버튼을 클릭 핸들러 수정 :

$OKButton.Add_Click({$global:x=$objListBox.SelectedItem;$objForm.Close()}) 

참고 $x 변수에 대한 global: 범위 지정자의 사용을. PowerShell은 동적 범위 지정을 사용하고 변수에 대한 "copy-on-write"접근 방식을 사용합니다. 즉, 전역 범위에서 $ x가 정의되었다고 가정하면 함수에서 $x을 수정하면 변수의 로컬 복사본 만 수정됩니다. $ x의 전역 값을 수정하려는 의도라면 전역 지정자를 사용해야합니다. $global:x = ....

+0

이 들린다. 스크립트 안에 포함 된 상태에서 $ x를 그 함수 밖에서 어떻게 사용할 수 있습니까? 또한, 두 번째 스크립트에서 대화 디스플레이를 깬 것은 무엇입니까? – Iszi

+0

알았어, 내 의견 질문의 첫 부분을 알아 냈다고 생각해. '$ x'를'$ script : x'로 바꿨습니다. 아직도 두 번째 스크립트에서 무엇이 잘못 되었습니까? – Iszi

+0

신경 쓰지 마세요. 그것을 발견. '$ objForm.Controls.Add ($ objListBox)'가 없습니다. – Iszi

3

목록 상자의 기능을 가져 오는 쉬운 방법은 Out-GridView을 사용하는 것입니다. 예 :

'one','two','three','four' | Out-GridView -OutputMode Single 

사용자가 항목을 선택할 수 있으며 파이프 라인으로 반환됩니다.

다중 선택에도 -OutputMode Multiple을 사용할 수 있습니다.

또 다른 예 :

get-process | Out-GridView -OutputMode Multiple 

enter image description here

이 선택한 개체를 반환은 : 그것은 스크립트의 범위에 도달 할 수처럼

Handles NPM(K) PM(K)  WS(K) VM(M) CPU(s)  Id ProcessName 
------- ------ -----  ----- ----- ------  -- ----------- 
    396  24  5008  8964 113  8,88 3156 AuthManSvr