Лучший отвечающий
работа с датами

Вопрос
-
есть скрипт, читающий два контроллера домена и выдающий дату последней регистрации компьютера на контроллере домена:
$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. Как сделать условие "если дата старше двух недель то ****"?Спасибо!
- Изменено AnahaymModerator 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
- Помечено в качестве ответа AnahaymModerator 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
- Помечено в качестве ответа AnahaymModerator 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Модератор