Powershell - 如何在我的脚本中中断或限制我的命令/功能

时间:2013-06-24 15:40:12

标签: powershell

这种情况: 我有一个使用模块ShowUI的Powerhsell脚本。 我使用此模块使Button将VM与RDP连接。 在我的脚本中,我必须测试计算机TS服务并返回颜色+句子。 我在“While”中使用此功能来测试所有(5)台计算机(这意味着刷新5个按钮状态):

function Get-VM_RDP_State { param ( [string]$var )

$RDP_State = Get-Service -ComputerName $var -Name TermService
if ( $? -eq 0 ) { 
    $Color_return = "Red"
    $State_return = "Error."
} 
elseif ( $RDP_State.Status -eq "Running" ) {
    $Color_return = "Green" 
    $State_return = "You can Connect."
} 
else { 
    $Color_return = "Orange"
    $State_return = "Wait..."
}               
return $Color_return , $State_return    

}

除一个案例(第一个案例)外,所有工作都很好: 如果一台计算机未启动或崩溃,“Get-Service”会等待一段时间,然后再向我发出错误:这会使我的ShowUI窗口崩溃。

我在ShowUI的“窗口”中调用此函数

On_Loaded = {
    Register-PowerShellCommand -ScriptBlock {

            Get-ParentControl $VM_List_Used

            $j = 0

            While ( $VM_List_Used[0,$j] ) {

                $VM_Name_temp = $VM_List_Used[0,$j]
                $VM_IP = $VM_List_Used[1,$j]

                $VM_Circle_temp = "Circle_" + "$VM_Name_temp"
                $VM_Text_temp = "Text_" + "$VM_Name_temp"

                $result = Get-VM_RDP_State($VM_IP_temp)

                $Circle_Color = $Window | Get-ChildControl $VM_Circle_temp
                $Circle_Color.Fill = $result[0]    
                $Text_Content = $Window | Get-ChildControl $VM_Text_temp
                $Text_Content.text = $result[1] 

                $j++
           }        
    }            
} -Run -In "0:0:2.0"    

如何在我的脚本中编写某个地方我不想等待超过几毫秒来获得get-service(或任何其他解决方案的回复!)

2 个答案:

答案 0 :(得分:0)

可能有更优雅的方式,但这应该有效:

function Get-VM_RDP_State {
  param ([string]$var)
  $job = Start-Job {Get-Service -ComputerName $var -Name TermService}
  Wait-Job $job -Timeout .005 # Or whatever amount of time in seconds you want to wait
  if ($job.state -ne 'Completed') {
    Remove-Job $job -Force
    return 'Red', 'Error.'
  } else {
    $RDP_State = Receive-Job $job
    if ( $RDP_State.Status -eq "Running" ) {
      return 'Green', 'You can connect.'
    } else {
      return 'Orange','Wait...'
    }
  }
}

顺便说一句,没有什么能阻止你有多个返回语句(它在第一次遇到return语句时存在),所以你通过分配返回表达式的部分来使代码过于复杂变量并在最后使用这些变量调用返回。但如果你决心这样做,你可以改回来。

答案 1 :(得分:0)

感谢您的回复,

对于信息:我必须在代码中更改1-2个内容。

首先: $ job = Start-Job {Get-Service -ComputerName $ var -Name TermService} 不起作用。搜索后,我必须使用scriptblock:

**$job = Start-Job -ScriptBlock { Get-Service -ComputerName $args[0] -Name spooler } -ArgumentList $var**

第二件事,如果作业状态为已完成,当我在功能后使用我的返回时,返回[0]始终是作业状态,但不是在我停止它的情况下,这就是我必须使用的原因:

stop-job -Job $job -PassThru

有了这个,停止工作也给我一个回报,我不得不使用结果[1]&结果[2]为我的颜色&测试

我目前的代码:

function Get-VM_RDP_State {  param ([string]$var)

    $job = Start-Job -ScriptBlock { Get-Service -ComputerName $args[0] -Name TermService } -ArgumentList $var
    Wait-Job $job -Timeout 0.6 
    if ( $job.state -ne 'Completed' ) {        
        stop-job -Job $job -PassThru
        remove-Job -job $job -Force
        $Color_return = "Red"
        $State_return = "Error."
    } 
    else {
        $RDP_State = Receive-Job -job $job
        if ( $RDP_State.Status -eq "Running" ) {     
            $Color_return = "Green" 
            $State_return = "You can connect."
        } 
        else {
            $Color_return = "Orange"
            $State_return = "Wait..."
        }
    }
    return $Color_return , $State_return
}

我的上一期:使用Wait-job -Timeout 0.6,一切都很完美:在0.6秒后,Job完成与否,代码继续。但如果计算机没有回复( job.state -ne'已完成'停止作业-Job $ job -PassThru 使 50s 停止工作:(

我找不到任何解决方案:/

有人有想法吗?