2014-01-17 2 views
1

У меня есть функция в powershell, которая остановит службу или запустит службу в зависимости от входного параметра функции. Он находится внутри цикла, который проверяет значение 5, если оно не выполняется в первый раз. Сейчас он установлен таким образом, что он должен заканчиваться, когда статус службы остановлен. Как я могу проверить один и тот же цикл, если статус службы запущен ... Это действительно логичный вопрос о том, можете ли вы иметь диаметрально противоположные конечные условия в цикле while. Но у меня есть некоторый сокращенный код для вас ...Две логически противоположные конечные условия в цикле while

[System.ServiceProcess.ServiceController]$service = Get-Service -Name $ServiceName -ComputerName $Remoteserver 
[int]$waitCount = 5 
do 
{ 
    $waitCount-- 

    switch($service.Status) 
    { 
      { @(
      [System.ServiceProcess.ServiceControllerStatus]::ContinuePending, 
      [System.ServiceProcess.ServiceControllerStatus]::PausePending, 
      [System.ServiceProcess.ServiceControllerStatus]::StartPending, 
      [System.ServiceProcess.ServiceControllerStatus]::StopPending) -contains $_ } 
      { 
       # A status change is pending. Do nothing. 
       break; 
      } 
      { @(
      [System.ServiceProcess.ServiceControllerStatus]::Paused, 
      [System.ServiceProcess.ServiceControllerStatus]::Running) -contains $_ } 
      { 
       # The service is paused or running. We need to stop it. 
       if($StopOrStart -eq "stop"){ 
        $service.Stop() 
        write-host("Stopped.") 
        break; 
       } 
      } 
      { @(
      [System.ServiceProcess.ServiceControllerStatus]::Stopped) -contains $_ } 
      { 
      #if Stop or Start is equal to start then start the service. 
       if($StopOrStart -eq "start"){ 
        $service.Start() 
        write-host("Started.") 
        break; 
       } 
      }    
    } 
    # Sleep, then refresh the service object. 
    Sleep -Seconds 1 
    $service.Refresh() 
} while (($service.Status -ne [System.ServiceProcess.ServiceControllerStatus]::Stopped) -and $waitCount -gt 0) 

Я пытаюсь придумать способ закончить время цикла, если $ service.Status -ne Started, если $ StopOrStart равно «Пуск»?

Я действительно не хочу писать две функции, которые делают одно и то же, одно для запуска служб, а другое - для остановки, когда я могу иметь тот, который это делает.

ответ

1

Мгновенное создание булевых значений для указания успешной операции.

[BOOL] $ WasSuccessful = $ ложного

Затем в условном тесте шагов для того, чтобы статус был успешно установлен. Если бы это было так, тогда выручите. Matching, как вы делали это:

[bool]$WasSuccessful = $false 

[System.ServiceProcess.ServiceController]$service = Get-Service -Name $ServiceName -ComputerName $Remoteserver 
[int]$waitCount = 5 
do 
{ 
    $waitCount-- 

    switch($service.Status) 
    { 
      { @(
      [System.ServiceProcess.ServiceControllerStatus]::ContinuePending, 
      [System.ServiceProcess.ServiceControllerStatus]::PausePending, 
      [System.ServiceProcess.ServiceControllerStatus]::StartPending, 
      [System.ServiceProcess.ServiceControllerStatus]::StopPending) -contains $_ } 
      { 
       # A status change is pending. Do nothing. 
       break; 
      } 
      { @(
      [System.ServiceProcess.ServiceControllerStatus]::Paused, 
      [System.ServiceProcess.ServiceControllerStatus]::Running) -contains $_ } 
      { 
       # The service is paused or running. We need to stop it. 
       if($StopOrStart -eq "stop"){ 
        $service.Stop() 
        If ((Get-Service -ComputerName $Remoteserver -Name $ServiceName).Status -eq "Stopped") { 
         write-host("Stopped.") 
         $WasSuccessful = $true 
        } 
       } 
      } 
      { @(
      [System.ServiceProcess.ServiceControllerStatus]::Stopped) -contains $_ } 
      { 
      #if Stop or Start is equal to start then start the service. 
       if($StopOrStart -eq "start"){ 
        If ((Get-Service -ComputerName $Remoteserver -Name $ServiceName).Status -eq "Running") { 
         write-host("Started") 
         $WasSuccessful = $true 
        } 
       } 
      }    
    } 
    # Sleep, then refresh the service object. 
    Sleep -Seconds 1 
    $service.Refresh() 
} while (($WasSuccessful -ne $true) -and $waitCount -gt 0) 
+0

Это звучит как лучшая идея. Я пинал варианты, похожие на то, что я сам – SoftwareSavant

0

Не проверено:

$service = Get-Service -Name $ServiceName -ComputerName $Remoteserver 
$waitCount = 5 
do 
{ 
    $waitCount-- 

    switch -Regex ($service.Status) 
    { 
     'Pending$' 
     { 
      # A status change is pending. Do nothing. 
      break; 
     } 

     'Paused' 
     { 
      # The service is paused. We need to stop or start it. 
      if($StopOrStart -eq "stop"){ 
       $service.Stop() 
       write-host("Stopped.")} 

      if($StopOrStart -eq "start"){ 
       $service.Start() 
       write-host("Started.")} 
     } 

     'Stopped' 
     { 
      if($StopOrStart -eq "Stop"){ Return } 

      if($StopOrStart -eq "Start"){ 
      $service.Start() 
      write-host("Started.")} 

     } 

    'Started' 
     { 
      if($StopOrStart -eq "Start"){ Return } 

      if($StopOrStart -eq "Stop"){ 
      $service.Stop() 
      write-host("Stopped.")} 

     }  
    } 

    # Sleep, then refresh the service object. 
    Sleep -Seconds 1 
    $service.Refresh() 

} While ($waitCount -gt 0) 
Смежные вопросы