Сравните две разные даты через powershell

Я хочу сравнить переменные 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"

}

Но он не работает должным образом. Можете ли вы уточнить?

user459872 05.09.2024 09:50

Скажем, если $LogonDate меньше $cutoffDate, я хочу запустить несколько команд внутри оператора if. когда я запускаю вышеуказанную команду, она не дает никакого результата. Обычно я ожидаю вывода «ОК» от Write-Host.

Arbelac 05.09.2024 09:54

Что такое Get-LastLogon? У вас есть ссылка на документацию по командлетам?

user459872 05.09.2024 09:57

Get-LastLogon — это пользовательская функция PowerShell. У меня нет проблем с этой функцией. Я хочу сравнить каждые две даты выше. Я написал примеры результатов.

Arbelac 05.09.2024 09:59

Можете ли вы распечатать тип обеих переменных, используя GetType()?

user459872 05.09.2024 10:03

$LogonDate, вероятно, имеет тип [String], где $cutoffDate имеет тип [DateTime] (проверьте: $LogonDate.GetType()). Обычно при сравнении левая часть определяет приведение типов, что означает, что вы сравниваете даты как объекты string (а не объекты datetime). Другими словами: если вы поменяете операнды местами (и отмените оператор): (if ($cutoffDate -ge $LogonDate) {...), все должно работать так, как ожидалось.

iRon 05.09.2024 10:20

$cutoffDate.GetType() -> DateTime $LogonDate.GetType() -> Строка

Arbelac 05.09.2024 11:16

Пожалуйста, добавьте информацию из вашего последнего комментария к вопросу

iRon 05.09.2024 13:26

Без кода get-lastlogon этот вопрос не имеет смысла.

js2010 05.09.2024 16:32
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
9
53
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Из комментариев в вопросе видно, что:

$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)) {

Другие вопросы по теме

Как я могу показать вывод $(команды), который вызывается внутри сценария .ps1
Как получить значение роли приложения с учетом идентификатора роли приложения в Entra ID с помощью Microsoft Graph Powershell?
Как получить список конвейеров в фабрике данных Azure для определенной ветки?
Доступ к параметрам приложения логики в коде сценария PowerShell в стандартных рабочих процессах
Использование API NDepend из сценария Windows PowerShell 5.1 приводит к ошибке регистра букв CLS
Перемещение изображений в подпапках в зависимости от ориентации
Как запросить разрешения OAuth2 для субъектов службы в Entra ID с помощью Microsoft Graph Powershell?
Невозможно обновить переменные в сценарии PowerShell файла yml Azure Devops
Отсутствует терминатор в PowerShell CLI в цикле for с использованием расширенных переменных
Как получить доступ к защищенной переменной в свойстве условия задачи Powershell в конвейере Azure