为什么我的Powershell Runbook无法正确理解时间?

时间:2018-09-18 04:26:03

标签: azure powershell azure-automation

我有一个Azure实例,带有两个标签,PHExempt是TRUE或FALSE,还有一个名为OpeningHours的标签,其中包含诸如0900-> 1730-M-> F之类的字符串,表示何时可以正常工作。 >

以下功能在需要关闭计算机时将其关闭,但仅在从Azure Powershell Runbook运行该计算机时才将其关闭。它可以在笔记本电脑上正常运行(通常“在我的机器上可以运行”)。为什么?

  foreach ($box in ($environment | Sort-Object -Property Name)) {
# I don't know why but for some reason $box.Name in a string doesn't swap in, we need to set a display name in the loop
$displayName = $box.Name

$boxOpening = Get-Date -Hour ($box.Tags.OpeningHours.Split("->")[0]).substring(0,2) -Minute ($box.Tags.OpeningHours.Split("->")[0]).substring(2,2)
$boxClosing = (Get-Date -Hour ($box.Tags.OpeningHours.Split("->")[2]).substring(0,2) -Minute ($box.Tags.OpeningHours.Split("->")[2]).substring(2,2))

if ($boxClosing.Hour -lt 12) { #do we close in the morning?
  $boxClosing = $boxClosing.AddDays(1) #tomorrow not today
}

if (($currenttime -gt $boxOpening) -and ($currenttime -lt $boxClosing)) {
  $shouldBeOn = "TRUE"
} else {
  $shouldBeOn = "FALSE"

}


$Name = $box.Name
Write-Host "$Name opens at $boxOpening and closes at $boxClosing, should be on is $shouldBeOn"

if ($shouldBeOn -eq "FALSE") {
  if ($box.Tags.PHExempt -eq "FALSE") {
    if ((Get-AzureRmVM -ResourceGroupName $box.ResourceGroupName -Name $Name -Status | Select-Object -ExpandProperty Statuses `
           | Where-Object { $_.Code -match "PowerState" } | `
           Select-Object -ExpandProperty DisplayStatus) -eq "VM running") {
      Stop-AzureRmVM -Name $box.Name -ResourceGroupName $box.ResourceGroupName -Force
    }
  }
} elseif ($shouldBeOn -eq "TRUE") {
  if ((Get-AzureRmVM -ResourceGroupName $box.ResourceGroupName -Name $Name -Status | Select-Object -ExpandProperty Statuses `
         | Where-Object { $_.Code -match "PowerState" } | `
         Select-Object -ExpandProperty DisplayStatus) -eq "VM deallocated") {

    Start-AzureRmVM -Name $box.Name -ResourceGroupName $box.ResourceGroupName
  }
}

}

1 个答案:

答案 0 :(得分:0)

时区糟透了。

问题确实是格林尼治标准时间的问题(Shadowzee,如果您添加答案而不是评论,我将其投票为正确答案)。如果与格林威治标准时间(GEST)相比,格林尼治标准时间(GEST)当前为昨天,则基本上无法使用get-date计算打开时间和关闭时间,并使用标记中的时间覆盖小时。日志显示-经过仔细检查,由于当前时间不在YESTERDAY的开门和关门时间之间,因此没有打开机器。