Я хочу сравнить переменные CutoffDate и LogonDate. Я использую функцию Get-LastLogon. Но он не работает должным образом.
PS C:\Windows\system32> $LogonDate
Monday, December 11, 2023 11:54:34 PM
PS C:\Windows\system32> $cutoffDate
Friday, June 7, 2024 10:33:45 AM
Скрипт:
# Define the date 90 days ago from today
$cutoffDate = (Get-Date).AddDays(-90)
$LogonDate = (Get-LastLogon -Identity "user").DateTime
if ($LogonDate -lt $cutoffDate) {
#Do something
write-host "ok"
}
Скажем, если $LogonDate меньше $cutoffDate, я хочу запустить несколько команд внутри оператора if. когда я запускаю вышеуказанную команду, она не дает никакого результата. Обычно я ожидаю вывода «ОК» от Write-Host.
Что такое Get-LastLogon
? У вас есть ссылка на документацию по командлетам?
Get-LastLogon — это пользовательская функция PowerShell. У меня нет проблем с этой функцией. Я хочу сравнить каждые две даты выше. Я написал примеры результатов.
Можете ли вы распечатать тип обеих переменных, используя GetType()
?
$LogonDate, вероятно, имеет тип [String]
, где $cutoffDate
имеет тип [DateTime]
(проверьте: $LogonDate.GetType()
). Обычно при сравнении левая часть определяет приведение типов, что означает, что вы сравниваете даты как объекты string
(а не объекты datetime
). Другими словами: если вы поменяете операнды местами (и отмените оператор): (if ($cutoffDate -ge $LogonDate) {...
), все должно работать так, как ожидалось.
$cutoffDate.GetType() -> DateTime $LogonDate.GetType() -> Строка
Пожалуйста, добавьте информацию из вашего последнего комментария к вопросу
Без кода get-lastlogon этот вопрос не имеет смысла.
Из комментариев в вопросе видно, что:
$LogonDate = [String]'Monday, December 11, 2023 11:54:34 PM'
$cutoffDate = [DateTime]'Friday, June 7, 2024 10:33:45 AM'
$LogonDate.GetType().Name
String
$cutoffDate.GetType().Name
DateTime
В PowerShell (как и в большинстве других свободных языков программирования) операнд в левой части оператора определяет приведение типов, используемое для выравнивания типов операндов перед выполнением операции.
Это касается большинства операторов.
'1' + 2
12
1 + '2'
3
Это означает, что если тип строки ($LogonDate
) находится в левой части, вы выполните сравнение строк:
$LogonDate -lt $cutoffDate
False
Обратите внимание, что даже Monday, December 11, 2023 11:54:34 PM
стоит перед Friday, June 7, 2024 10:33:45 AM
, сравнение False
, потому что M
в Monday
не меньше, чем F
в Fryday
.
Другими словами, решение вашей проблемы состоит в том, чтобы поменять местами операнды и инвертировать оператор (противоположность оператору -lt
: -ge
), чтобы тип DateTime ($cutoffDate
) находился в левой части и, следовательно, предварительно выполнялось сравнение DateTime:
$cutoffDate -ge $LogoDate
True
Для получения более подробной информации см. (на сегодняшний день) обновленный документ об операторах сравнения.
Другой вариант — преобразовать строковое значение в значение DateTime для сравнения или во все значения дат, если вы не хотите отслеживать тип каждого из них. Так, например, либо
if ($(Get-Date -Date $LogonDate) -lt $cutoffDate) {
или
if ($(Get-Date -Date $LogonDate) -lt $(Get-Date -Date $cutoffDate)) {
Но он не работает должным образом. Можете ли вы уточнить?