在切换循环中计算时间跨度?

时间:2019-09-02 10:13:18

标签: powershell timespan

我需要创建一个代码,以天/小时/分钟为单位查找总的正常运行时间... 因此,我需要一种方法来对每个循环进行时间间隔,然后最后将时间间隔结果相加以获得总的正常运行时间数。

这是我到目前为止所拥有的

function Get-UpTime 
{
    param($computername='localhost')
    Get-WmiObject win32_NTLogEvent -Filter 'Logfile="System" and EventCode>6004 and EventCode<6007' -ComputerName $computername | Sort-Object -Property TimeGenerated | 
        ForEach-Object {
            $rv = $_ | Select-Object EventCode,TimeGenerated 
            switch ($_.EventCode) {
                6005 { $rv.EventCode = 'start';$start=$_.TimeGenerated }                
                6006 { $rv.EventCode = 'shutdown';$shutdown=$_.TimeGenerated}
            }

            $rv.TimeGenerated = $_.ConvertToDateTime($_.TimeGenerated)
            $rv

        } 

}
Get-Uptime

2 个答案:

答案 0 :(得分:0)

您是否考虑过使用(Get-CimInstance Win32_OperatingSystem).LastBootUpTime
无论如何,结果将为日期时间格式,并且更易于计算。

它将允许您在一台或多台计算机上运行命令:

Get-CimInstance Win32_OperatingSystem -ComputerName Computer1, Computer2 | 
select LastBootUpTime, PSComputerName

还有另一个提示:除非您没有特定要求,否则请尽量避免循环处理计算机。 如果您使用Invoke-Command,则它将同时对32台计算机并行处理命令(默认情况下),因此比循环串行处理要快得多。

希望有帮助。

最好的问候, 伊万

答案 1 :(得分:0)

您可以使用WMI查询轻松完成此操作:

Get-WmiObject -Class Win32_OperatingSystem -ComputerName Computer1 | Select-Object __Server,@{Label="Uptime"; Expression={(Get-Date) - ($_.ConvertToDateTime($_.LastBootUpTime))}}

致谢。