2015-07-13 44 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感谢您的帮助! –