2013-12-08 38 views
1

我們使用powershell腳本將對象置於維護模式。問題是,它suddently停止在所有的工作 - 有沒有錯誤,但腳本無可奈何SCOM維護模式powershell腳本在我公司使用

保養間隔定義了XML文件

例如

<MMWindow> 
<Name>MMG 129OP SVC WEBSOA</Name>  ---group containing objects 
<Schedule>Mon 19:30-Mon 23:00</Schedule> ---monday 19:30 to 23:00 
</MMWindow> 

,這裏是腳本

$ErrorActionPreference = "stop" 

$oAPI = new-object -comObject "MOM.ScriptAPI" 
$Error.Clear() 

If ($Debug -ne "true") 
{ 
    $Debug = [bool]$false 
} 
else 
{ 
    $Debug = [bool]$true 
} 

$DateTime = Get-Date 
$Interval = $IntervalSeconds/60 

If ($Debug) 
{ 
    $oAPI.LogScriptEvent("MaintenanceWindows.ps1",800,4,"The script 'MaintenanceWindows.ps1' is starting at $DateTime.") 
} 

$setupKey = Get-Item -Path "HKLM:\Software\Microsoft\Microsoft Operations Manager\3.0\Setup" 
$installDirectory = $setupKey.GetValue("InstallDirectory") | Split-Path 
$psmPath = $installdirectory + "\Powershell\OperationsManager\OperationsManager.psm1" 
Import-Module $psmPath 
#Import-Module "C:\Program Files\System Center 2012\Operations Manager\Console\Microsoft.EnterpriseManagement.OperationsManager.ClientShell.dll" 

New-SCOMManagementGroupConnection -ComputerName 123.ru 
$XmlPath = "C:\Monitoring\Maintenance\MaintenanceWindows.xml" 
[xml]$MMContent = Get-Content $XmlPath 

If ($Debug -and $Error) 
{ 
    $oAPI.LogScriptEvent("MaintenanceWindows.ps1",802,4,"Error: $Error. Time: $DateTime.") 
} 

if ($MMContent.HasChildNodes) 
{ 
    foreach ($MMWindow in $MMContent.MMWindows.MMWindow) 
    { 
     $ScheduledDays = ($MMWindow.Schedule).Split(",") 

     foreach ($ScheduledDay in $ScheduledDays) 
     { 
      $StartDay = ($ScheduledDay.Split("-").GetValue(0)).Split(" ").GetValue(0) 

      Switch ($StartDay) 
      { 
       "Mon" {$EndDay = "Monday" 
         $EndDayCount = 1} 
       "Tue" {$EndDay = "Tuesday" 
         $EndDayCount = 2} 
       "Wed" {$EndDay = "Wednesday" 
         $EndDayCount = 3} 
       "Thu" {$EndDay = "Thursday" 
         $EndDayCount = 4} 
       "Fri" {$EndDay = "Friday" 
         $EndDayCount = 5} 
       "Sa" {$EndDay = "Saturday" 
         $EndDayCount = 6} 
       "Su" {$EndDay = "Sunday" 
         $EndDayCount = 7} 
      } 

      $EndDay = ($ScheduledDay.Split("-").GetValue(1)).Split(" ").GetValue(0) 

      Switch ($EndDay) 
      { 
       "Mon" {$EndDay = "Monday" 
         $EndDayCount = 1} 
       "Tue" {$EndDay = "Tuesday" 
         $EndDayCount = 2} 
       "Wed" {$EndDay = "Wednesday" 
         $EndDayCount = 3} 
       "Thu" {$EndDay = "Thursday" 
         $EndDayCount = 4} 
       "Fri" {$EndDay = "Friday" 
         $EndDayCount = 5} 
       "Sa" {$EndDay = "Saturday" 
         $EndDayCount = 6} 
       "Su" {$EndDay = "Sunday" 
         $EndDayCount = 7} 
      } 

      [DateTime]$StartTime = ($ScheduledDay.Split("-").GetValue(0)).Split(" ").GetValue(1) 
      if ($EndDayCount -lt $StartDayCount) 
      { 
       [DateTime]$EndTime = ([DateTime]($ScheduledDay.Split("-").GetValue(1)).Split(" ").GetValue(1)).AddDays(7 - ($StartDayCount - $EndDayCount)) 
      } 
      else 
      { 
       [DateTime]$EndTime = ([DateTime]($ScheduledDay.Split("-").GetValue(1)).Split(" ").GetValue(1)).AddDays($EndDayCount - $StartDayCount) 
      } 

      If ($StartDay -eq (Get-Date).DayOfWeek -and (Get-Date) -ge $StartTime.AddMinutes(-($Interval + 10)) -and (Get-Date) -lt $StartTime.AddMinutes($Interval + 10)) 
      { 
        $Group = Get-SCOMGroup -DisplayName $MMWindow.Name 

      If ($Debug -and $Error) 
      { 
       $oAPI.LogScriptEvent("MaintenanceWindows.ps1",803,4,"Error: $Error. Time: $DateTime.") 
      } 

        If($Group) 
        { 
          $GroupMembers = $Group.GetRelatedMonitoringObjects() 
          If($GroupMembers.Count -gt 0) 
          { 
           Foreach ($Instance in $GroupMembers) 
            { 
            if (!$Instance.InMaintenanceMode) 
            { 
            Start-SCOMMaintenanceMode -Instance $Instance -EndTime $EndTime.ToUniversalTime() -Reason "PlannedOther" -Comment "Planned Maintenance Mode by Script" 
            $oAPI.LogScriptEvent("MaintenanceWindows.ps1",805,4, "Start MM for object: " + $Instance.DisplayName + ". End MM: " + $EndTime) 
          If ($Debug -and $Error) 
          { 
           $oAPI.LogScriptEvent("MaintenanceWindows.ps1",804,4,"Error: $Error. Time: $DateTime.") 
          } 
            } 
           } 
         } 
       } 
      } 
     } 
    } 
} 
If ($Debug) 
{ 
    $oAPI.LogScriptEvent("MaintenanceWindows.ps1",801,4, "The script 'MaintenanceWindows.ps1' is finished.") 
} 

有什麼想法?

+0

您是否啓用了啓用調試的腳本? –

+0

$ ErrorActionPreference =「停止」,這還不夠嗎?如何強制ps顯示所有錯誤和警告?像空串等等?我不是程序員( –

+0

)設置'$ ErrorActionPreference =「Stop」'應該讓腳本打印一條錯誤消息,並在出現錯誤時終止。但是,根據運行方式的不同,您可能會也可能不會看到消息。 ,這個腳本看起來像是寫了一個不同類型的錯誤處理記憶。 –

回答

0

由於Ansgar指出瞭解決問題的好方法,就像通過某種調試一樣。

然而,你詢問了一些想法,所以這裏有一些: 1.我看到腳本做「沒有」(假設它運行)的一種可能方式是$ GroupMembers爲空。 2. $ GroupMembers依賴$ Group評估爲$ true,因此如果$ Group爲$ null,則不會發生任何情況。 3. $組未分配,除非出現以下計算$真:

$StartDay -eq (Get-Date).DayOfWeek -and 
(Get-Date) -ge $StartTime.AddMinutes(-($Interval + 10)) -and 
(Get-Date) -lt $StartTime.AddMinutes($Interval + 10)) 
  1. 這是表達真$依賴於$間隔值。 $ Interval基於$ IntervalSeconds定義 - 其定義未在OP中顯示。因此,StackOverflow響應者無法幫助您使用該代碼路徑。

  2. 其他一些可能的失敗是Get-SCOMGroup返回$ null或GetRelatedMonitoringObjects返回$ null。

由於原來的問題提出了想法,我給了你幾個合理的想法,我會說我回答了這個問題。

+0

intervalseconds = 300後,也會分享這個腳本SCOM社區。無論如何打開所有的錯誤和警告? –

+0

很多Powershell cmdlet都可以提供詳細和/或調試輸出。運行'help about_preference_variables'並查找$ DebugPreference和$ VerbosePreference。 Set-StrictMode可用於查找某些類型(通常是編碼)的錯誤。 Trace-Command可以用來獲取大量的內部信息。然而,就你而言,通過在腳本中添加一些調試語句(我在調試時使用'write-host')可能會更好。也看起來像@ Start-Automating的答案具有特定於SCOM維護模式的信息。 –

+0

寫主機幫助很大,thx –

0

我的公司在幾年前爲Microsoft寫了這些cmdlet。這個問題引起了SCOM愛好者朋友的關注,並經常需要改變維護模式。我檢查了一下,我相信Start-SCOMMaintenanceMode和Update-SCOMMaintenanceMode命令可以解決這個問題(併爲您節省大量代碼)。

如果情況並非如此,請讓我知道。

+0

問題是在XML中,因爲我猜測,而不是在cmdlet –