0

这里是这种情况:我有一个使用模块 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(或任何其他解决方案!)的回复

4

2 回答 2

0

There might be a more elegant way, but this should work:

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...'
    }
  }
}

BTW, nothing prevents you from having multiple return statements (it exist the first time a return statement is encountered), so you're over-complicating your code by assigning the parts of your return expression to variables and calling return at the end with those variables. But you can change that back if you're determined to do it that way.

于 2013-06-24T18:12:41.917 回答
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**

第二件事,如果工作状态已完成,当我在函数后使用我的 return 时,return[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.state -ne 'Completed'),则停止作业 -Job $job -PassThru需要50 秒才能停止作业:(

我没有找到任何解决方案:/

有人有想法吗?

于 2013-06-27T07:40:36.657 回答