2015-03-20 3 views
1

Вот мой PowerShell скрипт:Powershell показывая старое время после изменения часового пояса

$time = (Get-Date).ToShortTimeString() 
Write-Host "Current Time: "$time 
$destzone = [System.TimeZoneInfo]::FindSystemTimeZoneById("Central Standard Time") 
$desttime = [System.TimeZoneInfo]::ConvertTimeFromUtc((Get-Date).ToUniversalTime(), $destzone) 
$desttime = $desttime.ToShortTimeString() 
Write-Host "UTC-6 = "$desttime 
$newtime = (Get-Date).ToShortTimeString() 
Write-Host "Current Time: "$newtime 
if($newtime -eq $desttime) 
{ 
Write-Host "ok" 
}else 
{ 
C:\Windows\System32\tzutil.exe /s "Central Standard Time" 
} 

То, что я пытаюсь достичь, что

  1. Получить текущее системное время
  2. Сравните это с универсальным Время (utc-6)
  3. Если это то же самое, тогда ничего не поделаешь. Если нет, измените системный часовой пояс на utc-6

Все работает, но после установки системного часового пояса на utc-6, когда я проверяю текущее системное время, оно показывает мне старое время (хотя Я вижу, что системный часовой пояс изменился)

Похоже, что-то вроде кэширования. Есть ли что-нибудь подобное? Или что-то не так с моим сценарием?

Может кто-нибудь, пожалуйста, проведет меня через хороший способ?

+1

Из любопытства новый сеанс PowerShell, созданный после изменения часового пояса, отражает изменение? – Matt

ответ

1

Это не ошибка вашего сценария. Powershell только считывает часовой пояс при создании сеанса.

Get-Date и .Net методы, такие как [System.TimeZoneInfo]::Local «кеш», поэтому самым простым решением является закрытие окна и запуск нового сеанса Powershell. Запуск новой локальной сессии и импорт ее также «решает» проблему, но довольно неуклюжий.

Объекты WMI не подвержены одной и той же проблеме «кеша». Рассмотрим это как вариант:

$curzone = (Get-WMIObject –Class Win32_TimeZone).Caption 
$destzone = [System.TimeZoneInfo]::FindSystemTimeZoneById("Central Standard Time").DisplayName 
if($curzone -eq $destzone) 
{ 
Write-Host "Current Time Zone already set to:"$curzone 
}else 
{ 
C:\Windows\System32\tzutil.exe /s "Central Standard Time" 
$newcurzone = (Get-WMIObject –Class Win32_TimeZone).Caption 
Write-Host "Time Zone updated to:"$newcurzone 
} 

P.S. В случае, если они исправит это позже, в настоящее время это воспроизводится до Windows 10 tech preview 2 с Powershell 5.0

+0

Спасибо. Поскольку для меня было срочно решить, что я только что сделал, чтобы проверить часовой пояс, и это сработало. – serverstackqns