Скрипт Powershell для получения только часа и минуты из команды NET TIME

Я пытаюсь получить только дату и время из скрипта PowerShell. Ниже приведено то, что я пробовал до сих пор:

Автор сценария:

NET TIME \\ComputerName | Out-File $location

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

net time вывод как ниже:

Текущее время в \\ Имя компьютера - 03.01.2008 13:05:51

Местное время (GMT-07:00) в \\ Имя компьютера - 01.01.08 11:05:51

Команда выполнена успешно.

Мне нужна только часть по местному времени "11:05".

4 ответа

Решение

Используйте -match для проверки регулярных выражений. Затем проверьте совпадения с помощью автоматически сгенерированного массива $match.

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

Хотя Get-Date не поддерживает запросы к удаленным компьютерам, информацию о дате / времени и часовом поясе с удаленного компьютера можно получить с помощью WMI; Пример можно найти на этой странице TechNet PowerShell Gallery. С использованием Win32_LocalTime класс, скорректированный на основе Win32_TimeZone класс, предоставит информацию в форме, которая легко преобразуется в [DateTime] для дальнейшего использования в вашем скрипте.

Я понимаю, что это может не сработать, если вы не включили удаленное взаимодействие PowerShell, но если это так, я бы сделал это следующим образом.

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

краткое

Вы можете использовать эту функцию, чтобы получить любую информацию, которую вы хотите. Я адаптировал код из этого скрипта. Преобразует LocalDateTime значение, полученное с помощью Get-WmiObject в DateTime объект. После этого вы можете делать все, что захотите, с информацией о дате. Вы также можете адаптировать это, чтобы использовать любую переменную DateTime, которую вы хотите (то есть время последней загрузки).


Код

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")
Другие вопросы по тегам