2015-07-13 92 views
1

我正在爲我們的支持部門和實習生創建一個腳本。我有一個工作腳本,但想要使用GUI對我們的實習生來說更容易一些。此時我正在拉我的頭髮,我已經複製了下面的功能,並希望具有值$task1_exec。但是,當我嘗試將$Result返回到變量中時,$Task1變量不是打印出的$Task1_exec之一。開關語句產生不正確的結果

$FormTitle = "Formtitle" 
$ScriptPath = $(get-location).Path; 

$task1 = "Task 1" 
$task1_exec = "Perform task 1" 
$task2 = "Task 2" 
$task2_exec = "Perform task 2" 
$task3 = "Task 3" 
$task3_exec = "Perform task 3" 
$task4 = "Task 4" 
$task4_exec = "Perform task 4" 

function Prompt-SelectionList 
{ 
    Param(
     [Parameter(Position=0,Mandatory=$true)][string]$Description, 
     [Parameter(Position=1,Mandatory=$true)][string[]]$List 
    ) 

    [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") 
    [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") 

    $Form = New-Object System.Windows.Forms.Form 
    $Form.Text = $FormTitle 
    $Form.Size = New-Object System.Drawing.Size(500,450) #(300,200) 
    $Form.StartPosition = "CenterScreen"  

    $btnOK = New-Object System.Windows.Forms.Button 
    $btnOK.Location = New-Object System.Drawing.Size(125,375) 
    $btnOK.Size = New-Object System.Drawing.Size(125,25) 
    $btnOK.Text = "Run..." 
    $Form.Controls.Add($btnOK) 

    $btnCancel = New-Object System.Windows.Forms.Button 
    $btnCancel.Location = New-Object System.Drawing.Size(250,375) 
    $btnCancel.Size = New-Object System.Drawing.Size(125,25) 
    $btnCancel.Text = "Exit" 
    $btnCancel.Add_Click({ $script:Result = $null; $Form.Close() }) 
    $Form.Controls.Add($btnCancel) 

    $Label = New-Object System.Windows.Forms.Label 
    $Label.Location = New-Object System.Drawing.Size(10,20) 
    $Label.Size = New-Object System.Drawing.Size(480,20) 
    $Label.Text = $Description 
    $Form.Controls.Add($Label) 

    $ListBox = New-Object System.Windows.Forms.ListBox 
    $ListBox.Location = New-Object System.Drawing.Size(10,40) 
    $ListBox.Size = New-Object System.Drawing.Size(460,330) 
    $List | ForEach-Object { [void] $ListBox.Items.Add($_) } 
    $Form.Controls.Add($ListBox) 

    $Form.KeyPreview = $True 
    $Form.Add_KeyDown({ if ($_.KeyCode -eq "Enter") { $script:Result = $ListBox.SelectedItem; $Form.Close() }}) 
    $Form.Add_KeyDown({ if ($_.KeyCode -eq "Escape") { $script:Result = $null; $Form.Close() }}) 
    $btnOK.Add_Click({ $script:Result = $ListBox.SelectedItem; $Form.Close() }) 

    $Form.Topmost = $True 
    $Form.Add_Shown({ $Form.Activate() }) 

    [void] $Form.ShowDialog() 

    return $Result 
} 

function Do-PromptTask 
{ 
    switch -wildcard (Prompt-SelectionList "Chose task to run:" @($task1,$task2,$task3,$task4)) 
    { 
     $task1{$task1_exec} 
     $task2{$task2_exec} 
     $Task3{$task3_exec} 
     $Task4{$task4_exec} 
     ""{Exit} #End Selection (cancel selected) 
     # "*"{Do-PromptTask} #Keep prompting until "cancel" selected 
    } 
} 

Do-PromptTask 

我的願望是,我可以回到$task1_exec到,所以當Do-PromptTask結束後返回一個變量可以被用來調用另一個腳本

. ".\Bin\$Result.ps1" 
+1

您從返回的任務標籤' Promp-SelectionList'函數,以便你的'switch'可以匹配它。這不就是你想做什麼嗎?如果你想讓'Do-PromptTask'返回'$ taskX_exec'的值,你不應該從'switch'的相應塊中返回該值嗎? –

+0

'return $ script:Result',該函數有自己的範圍 –

+0

無法重現您的問題。當我從PowerShell控制檯或腳本運行代碼時,代碼工作得很好。 –

回答

0

看起來你是在正確的軌道上。

讓我們假設我經營執行 - PromptTask,選擇任務1,點擊運行...

從提示-SelectionList $ result變量傳遞迴switch語句是超出範圍在這一點上。交換機正在做它的工作,並匹配條件,然後打印$ task1_exec,但$結果在這一點上是沒有用的。如果你想存儲$ task1_exec作爲變量,你需要設置一些與之相同的東西。但是,我會說你可以在switch語句中採取行動,而不需要將它存儲在一個變量中,如果有意義的話。

更少的代碼的做法...

function Do-PromptTask 
{ 
    switch -wildcard (Prompt-SelectionList "Chose task to run:" @($task1,$task2,$task3,$task4)) 
    { 
     $task1{Invoke-Expression $task1_exec} 
     $task2{Invoke-Expression $task2_exec} 
     $Task3{Invoke-Expression $task3_exec} 
     $Task4{Invoke-Expression $task4_exec} 
     ""{Exit} #End Selection (cancel selected) 
     # "*"{Do-PromptTask} #Keep prompting until "cancel" selected 
    } 
} 

如果你在存儲變量設置,你可以做這樣的事情...

function Do-PromptTask 
{ 
    switch -wildcard (Prompt-SelectionList "Chose task to run:" @($task1,$task2,$task3,$task4)) 
    { 
     $task1{$task_result = $task1_exec} 
     $task2{$task_result = $task2_exec} 
     $Task3{$task_result = $task3_exec} 
     $Task4{$task_result = $task4_exec} 
     ""{Exit} #End Selection (cancel selected) 
     # "*"{Do-PromptTask} #Keep prompting until "cancel" selected 
    } 
    Invoke-Expression $task_result 
} 
+0

這個awnser是完美的,我已經把Invoke-Expression改成了:'Invoke-Expression「$ ScriptPath \ Bin \ $ task_result.ps1」並設置了'$ task1_exec =「test」'所以輸出和執行的文件是: c:\ folder \ bin \ test.ps1感謝您的幫助! –

相關問題