我們使用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.")
}
有什麼想法?
您是否啓用了啓用調試的腳本? –
$ ErrorActionPreference =「停止」,這還不夠嗎?如何強制ps顯示所有錯誤和警告?像空串等等?我不是程序員( –
)設置'$ ErrorActionPreference =「Stop」'應該讓腳本打印一條錯誤消息,並在出現錯誤時終止。但是,根據運行方式的不同,您可能會也可能不會看到消息。 ,這個腳本看起來像是寫了一個不同類型的錯誤處理記憶。 –