WMI 任务:日期和时间
本文内容
有若干 WMI 类和一个脚本对象可用于分析或转换 CIM 日期/时间 格式。 有关其他示例,请参阅 TechNet ScriptCenter,网址为 https://www.microsoft.com/technet 。
本主题中显示的脚本示例仅从本地计算机获取数据。 有关如何使用脚本从远程计算机获取数据的详细信息,请参阅连接到远程计算机上的 WMI 。
要运行脚本
以下过程介绍如何运行脚本。
复制代码并将其保存在扩展名为 .vbs 的文件中,例如 filename.vbs 。 确保文本编辑器不会向文件添加 .txt 扩展名。
打开命令提示符窗口,并导航到保存文件的目录。
在命令提示符处键入 cscript filename.vbs 。
如果无法访问事件日志,请检查是否从提升的命令提示符运行。 某些事件日志(如安全事件日志)可能会受到用户访问控制 (UAC) 的保护。
注意
默认情况下,cscript 会在命令提示符窗口中显示脚本的输出。 由于 WMI 脚本可以生成大量输出,因此可能需要将输出重定向到文件。 在命令提示符下键入 cscript filename.vbs > outfile.txt ,将 filename.vbs 脚本的输出重定向到 outfile.txt 。
下表列出了可用于从本地计算机获取各种类型数据的脚本示例。
...…将 WMI 日期转换为标准日期和时间?
使用 SWbemDateTime 对象将这些对象转换为常规日期和时间。
Set dtmInstallDate = CreateObject("WbemScripting.SWbemDateTime")
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set objOS = objWMIService.ExecQuery("Select * from Win32_OperatingSystem")
For Each strOS in objOS
dtmInstallDate.Value = strOS.InstallDate
Wscript.Echo dtmInstallDate.GetVarDate
Next
或者让代码手动执行任务。
Function WMIDateStringToDate(dtmInstallDate)
WMIDateStringToDate = CDate(Mid(dtmInstallDate, 5, 2) & "/" & Mid(dtmInstallDate, 7, 2) _
& "/" & Left(dtmInstallDate, 4) & " " & Mid (dtmInstallDate, 9, 2) & ":" _
& Mid(dtmInstallDate, 11, 2) & ":" & Mid(dtmInstallDate,13, 2))
End Function
...确定计算机上当前配置的时间?
使用 Win32_LocalTime 类。
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_LocalTime")
For Each objItem in colItems
Wscript.Echo "Day: " & objItem.Day & VBNewLine _
& "Day Of Week: " & objItem.DayOfWeek & VBNewLine _
& "Hour: " & objItem.Hour & VBNewLine _
& "Minute: " & objItem.Minute & VBNewLine _
& "Month: " & objItem.Month & VBNewLine _
& "Quarter: " & objItem.Quarter & VBNewLine _
& "Second: " & objItem.Second & VBNewLine _
& "Week In Month: " & objItem.WeekInMonth & VBNewLine _
& "Year: " & objItem.Year
Next
# 指定计算机并获取本地时间 $Computer = "." $times = Get-WmiObject Win32_LocalTime -computer $computer <# 现在显示结果 #>
Foreach ($time in $times) {
"Day : {0}" -f $Time.Day
"Day Of Week : {0}" -f $Time.DayOfWeek
"Hour : {0}" -f $Time.Hour
"Minute : {0}" -f $Time.Minute
"Month : {0}" -f $Time.Month
"Quarter : {0}" -f $Time.Quarter
"Second : {0}" -f $time.Second
"Week In Month: {0}" -f $Time.WeekInMonth
"Year : {0}" -f $Time.Year
}
...确定计算机运行的时区名称?
使用 Win32_TimeZone 类并检查 Description 属性的值。
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_TimeZone")
For Each objItem in colItems
Wscript.Echo "Description: " & objItem.Description
Wscript.Echo "Daylight Name: " & objItem.DaylightName
Wscript.Echo "Standard Name: " & objItem.StandardName
Wscript.Echo
Next
$Computer = "."
$timezone = Get-WMIObject -class Win32_TimeZone -ComputerName $computer
<# Display details #>
if ($computer -eq ".") {$computer = Hostname}
"Time zone information on computer `"{0}`"" -f $computer
"Time Zone Description : {0}" -f $timezone.Description
"Daylight Name : {0}" -f $timezone.DaylightName
"Standard Name : {0}" -f $timezone.StandardName
...确保“10/02/2000”被解释为 2000 年 10 月 2 日,而不是“2000 年 2 月 10 日”?
以 CIM DATETIME 格式管理日期,并使用 SWbemDateTime 方法(如 GetVarDate )将其转换为 FILETIME 或 VT_Date 格式。 因为 DATETIME 格式独立于区域设置,所以可以编写在任何计算机上运行的脚本。 使用 SWbemDateTime 对象将这些对象转换为常规日期和时间。 有关转换日期和时间的详细信息,请参阅日期和时间格式 。
...将 WMI 日期/时间转换为 .NET 日期/时间值?
手动分析字符串,然后将检索到的值放入 DateTime 对象中。
function WMIDateStringToDateTime( [String] $strWmiDate )
{
$strWmiDate.Trim() > $null
$iYear = [Int32]::Parse($strWmiDate.SubString( 0, 4))
$iMonth = [Int32]::Parse($strWmiDate.SubString( 4, 2))
$iDay = [Int32]::Parse($strWmiDate.SubString( 6, 2))
$iHour = [Int32]::Parse($strWmiDate.SubString( 8, 2))
$iMinute = [Int32]::Parse($strWmiDate.SubString(10, 2))
$iSecond = [Int32]::Parse($strWmiDate.SubString(12, 2))
<# decimal point is at $strWmiDate.Substring(14, 1) #>
$iMicroseconds = [Int32]::Parse($strWmiDate.Substring(15, 6))
$iMilliseconds = $iMicroseconds / 1000
$iUtcOffsetMinutes = [Int32]::Parse($strWmiDate.Substring(21, 4))
if ( $iUtcOffsetMinutes -ne 0 )
{
$dtkind = [DateTimeKind]::Local
}
else
{
$dtkind = [DateTimeKind]::Utc
}
return New-Object -TypeName DateTime `
-ArgumentList $iYear, $iMonth, $iDay, `
$iHour, $iMinute, $iSecond, `
$iMilliseconds, $dtkind
}
脚本和应用程序的 WMI 任务
WMI C++ 应用程序示例
日期和时间 格式
TechNet ScriptCenter
`