用于仅从 NET TIME 命令获取小时和分钟的 Powershell 脚本

Powershell script to get only Hour and Minute from NET TIME command

提问人:prashanth tv 提问时间:1/4/2018 最后编辑:Ansgar Wiechersprashanth tv 更新时间:1/4/2018 访问量:2979

问:

我正在尝试仅从 PowerShell 脚本中检索日期和时间,以下是我迄今为止尝试过的内容:

脚本:

NET TIME \\ComputerName | Out-File $location

(Get-Content $location)  | % {
    if ($_ -match "2018 : (.*)") {
        $name = $matches[1]
        echo $name
    }
}

net time输出如下:

Current time at \\Computer Name is 1/3/2018 1:05:51 PM

Local time (GMT-07:00) at \\Computer Name is 1/3/2018 11:05:51 AM

The command completed successfully.

我只需要当地时间“11:05”的部分。

正则表达式 Windows PowerShell 时间 ob-get-contents

评论

2赞 Bill_Stewart 1/4/2018
你为什么需要这样做?您的计算机是否未将其时钟与附近的域控制器同步?
0赞 prashanth tv 1/4/2018
我需要它来执行另一个命令“Dumplog”,该命令仅将开始时间和结束时间作为参数。命令:dumplog ctisvr /bt “Local time” /m “CSTAUniversalFailureConfEvent” 因此,我需要服务器的本地时间运行最后 5 分钟。

答:

0赞 René González Venegas 1/4/2018 #1

使用 -match 测试正则表达式 然后检查与自动生成的$matches数组的匹配项

PS> "Current time at \Computer Name is 1/3/2018 1:05:51 PM Local time (GMT-07:00) at \Computer Name is 1/3/2018 11:05:51 AM" -match '(\d\d:\d\d):'
True
PS> $matches
Name                           Value
----                           -----
1                              11:05
0                              11:05:

PS> $matches[1]
11:05
2赞 Jeff Zeitlin 1/4/2018 #2

虽然不支持查询远程计算机,但可以使用 WMI 检索远程计算机中的日期/时间和时区信息;可以在此 TechNet PowerShell 库页中找到示例。使用根据类进行调整的类,将以一种易于转换为 的形式提供信息,以便在脚本中进一步使用。Get-DateWin32_LocalTimeWin32_TimeZone[DateTime]

0赞 Jonathan Perry 1/4/2018 #3

我意识到如果您没有启用 PowerShell 远程处理,这可能不适合您,但如果是这样,我会这样做。

Invoke-Command -ComputerName ComputerName -ScriptBlock {(Get-Date).ToShortTimeString()}

评论

0赞 prashanth tv 1/4/2018
这个不起作用,它给出了时间,但没有给出服务器的本地时间。:(
0赞 Jonathan Perry 1/4/2018
我应该测试更多,但我的所有机器都在一个时区。我修改了答案,将时间转换为远程机器上的字符串,现在它应该可以工作了。
0赞 prashanth tv 1/4/2018
有没有办法以 24 小时格式显示结果?
0赞 prashanth tv 1/4/2018
"{0:HH:mm}" -f [datetime] $x用过这个。现在它起作用了
0赞 ctwheels 1/4/2018 #4

您可以使用此功能获取所需的任何信息。我从这个脚本改编了代码。它将使用 获得的值转换为对象。此后,您可以对日期信息执行任何操作。您还可以调整它以使用所需的任何 DateTime 变量(即上次启动时间)。LocalDateTimeGet-WmiObjectDateTime


法典

function Get-RemoteDate {
    [CmdletBinding()]
    param(
        [Parameter(
            Mandatory=$True,
            ValueFromPipeLine=$True,
            ValueFromPipeLineByPropertyName=$True,
            HelpMessage="ComputerName or IP Address to query via WMI"
        )]
        [string[]]$ComputerName
    )
    foreach($computer in $ComputerName) {
        $timeZone=Get-WmiObject -Class win32_timezone -ComputerName $computer
        $localTime=([wmi]"").ConvertToDateTime((Get-WmiObject -Class Win32_OperatingSystem -ComputerName $computer).LocalDateTime)
        $output=[pscustomobject][ordered]@{
            'ComputerName'=$computer;
            'TimeZone'=$timeZone.Caption;
            'Year'=$localTime.Year;
            'Month'=$localTime.Month;
            'Day'=$localTime.Day;
            'Hour'=$localTime.Hour;
            'Minute'=$localTime.Minute;
            'Seconds'=$localTime.Second;
        }
        Write-Output $output
    }
}

使用以下任一方法调用该函数。第一个用于单台计算机,第二个用于多台计算机。

Get-RemoteDate "ComputerName"
Get-RemoteDate @("ComputerName1", "ComputerName2")

评论

0赞 prashanth tv 1/4/2018
我正在尝试为我的多台计算机列表实现此功能。
0赞 ctwheels 1/4/2018
@prashanthtv第二个调用正是这样做的。它采用一个字符串数组并循环使用它