none
работа с датами RRS feed

  • Вопрос

  • есть скрипт, читающий два контроллера домена и выдающий дату последней регистрации компьютера на контроллере домена:

    $CPU = Get-ADComputer -Filter * -SearchBase "OU=Test-OU,DC=domain,DC=local"
    foreach ($CPU in $CPU.name){
    $dc02 = Get-ADComputer -Identity $CPU -Properties * -server dc02 | select @{Name='LastLogon';Expression={[DateTime]::FromFileTime($_.LastLogon)}}
    $vdc02 = Get-ADComputer -Identity $CPU -Properties * -server vdc02 | select @{Name='LastLogon';Expression={[DateTime]::FromFileTime($_.LastLogon)}}
    $date = "$dc02","$vdc02"
    $CPU
    $date | Sort-Object | Select-Object -Last 1}

    Вывод:

    GCP-NB0102
    @{LastLogon=10/08/2019 15:10:31}
    GCP-VM0006-AM
    @{LastLogon=10/04/2019 12:13:06}
    GCP-VM0004-AM
    @{LastLogon=08/10/2019 15:58:36}
    CLST2
    @{LastLogon=06/30/2019 16:47:31}
    CLST1
    @{LastLogon=07/29/2019 13:24:54}
    GCP-NB0873
    @{LastLogon=08/14/2019 11:03:34}
    GCP-VM0005-AM
    @{LastLogon=10/08/2019 15:33:21}
    GCP-VM0001-AM
    @{LastLogon=08/07/2019 14:21:15}
    GCP-VM0002-AM
    @{LastLogon=08/06/2019 16:19:22}

    Несколько вопросов:
    1. Как избавится от @{LastLogon= ?
    2. Как поменять формат даты в DD.MM.YYY Time ? Вообще не понятно, почему он меняется. в $dc02 как раз такой.
    3. Как сделать условие "если дата старше двух недель то ****"?

    Спасибо!


    • Изменено Anahaym 8 октября 2019 г. 13:53
    8 октября 2019 г. 13:52

Ответы

  • Проблема в том, что вы преобразуете объект, содержащий поле LastLogon типа DateTime в строку.

    Вместо

    $date ="$dc02","$vdc02"

    напишите

    $dc02.LastLogon,$vdc02.LastLogon

    Получите тогда не массив строк, а массив DateTime, который, во-первых, сортироваться будет правильно, во-вторых - его можно и сравнивать  с другими датами, и вывести в удобном вам формате, например:

    $lastdate=$date | Sort-Object LastLogon | Select-Object -Last 1

    if ($lastdate -lt  ([DateTime]::Now-[TimeSpan]'14.00:00:00') ) {  "{0:dd.MM.yy HH:mm:ss}" -f  $lastdate }

    (вместо последней строки).

    PS Для понимания, что происходит, поезно понмить, что Powershell всегда работает с объектами. Тип объекта (или элемента массива, если это массив), содержащийся в переменной удобнее всего смотреть, передав её по конвейеру на вход Get-Member


    Слава России!


    • Изменено M.V.V. _ 8 октября 2019 г. 15:39
    • Предложено в качестве ответа Vector BCOModerator 8 октября 2019 г. 15:43
    • Помечено в качестве ответа Anahaym 11 октября 2019 г. 10:28
    8 октября 2019 г. 15:31

Все ответы

  • Проблема в том, что вы преобразуете объект, содержащий поле LastLogon типа DateTime в строку.

    Вместо

    $date ="$dc02","$vdc02"

    напишите

    $dc02.LastLogon,$vdc02.LastLogon

    Получите тогда не массив строк, а массив DateTime, который, во-первых, сортироваться будет правильно, во-вторых - его можно и сравнивать  с другими датами, и вывести в удобном вам формате, например:

    $lastdate=$date | Sort-Object LastLogon | Select-Object -Last 1

    if ($lastdate -lt  ([DateTime]::Now-[TimeSpan]'14.00:00:00') ) {  "{0:dd.MM.yy HH:mm:ss}" -f  $lastdate }

    (вместо последней строки).

    PS Для понимания, что происходит, поезно понмить, что Powershell всегда работает с объектами. Тип объекта (или элемента массива, если это массив), содержащийся в переменной удобнее всего смотреть, передав её по конвейеру на вход Get-Member


    Слава России!


    • Изменено M.V.V. _ 8 октября 2019 г. 15:39
    • Предложено в качестве ответа Vector BCOModerator 8 октября 2019 г. 15:43
    • Помечено в качестве ответа Anahaym 11 октября 2019 г. 10:28
    8 октября 2019 г. 15:31
  • Get-Date ($date | Sort-Object | Select-Object -Last 1).Lastlogon -format u

    The opinion expressed by me is not an official position of Microsoft

    8 октября 2019 г. 15:32
    Модератор
  • Спасибо, всё работает.
    11 октября 2019 г. 10:28