- Вопрос или проблема
- Сравнение с сегодняшней датой
- Условное выражение
- Пример оператора присваивания (=) вместо (-eq) в условном выражении
- Ответ или решение
- Как получить информацию о обновлениях Windows с помощью PowerShell
- 1. Проблемы с вашим кодом:
- Сравнение с сегодняшней датой
- Ошибка в конструкции if
- 2. Обновленный код
- 3. Пояснения по коду:
- Заключение
Вопрос или проблема
Я пытаюсь собрать подробную информацию о каждой из моих машин в сети. Я хотел бы извлечь информацию о обновлениях Windows и узнать, устарели ли они более чем на 30 дней, и вот что мне удалось собрать. Я знаю, что они работают отдельно, но не когда я объединяю их.
Надеюсь, кто-то может подсказать, что я делаю неправильно;
$WUpdateResult = (Get-Hotfix | Sort-Object -Property InstalledOn -Descending | Select-Object -First 1).InstalledOn
$WUR30Days = $WUpdateResult -lt 30
$info.WUpdateResult = if ($WUR30Days = "False") { $WUpdateResult } else { "N/A" }
Здесь есть несколько потенциальных проблем:
Сравнение с сегодняшней датой
Свойство InstalledOn
дает вам дату, когда обновление было установлено, но вы не сравниваете это с сегодняшней датой. Возможно, это то, что вы хотите:
$($(Get-Date) - $WUpdateResult).Days -lt 30
Условное выражение
Кроме того, $WUR30Days = "False"
просто присваивает значение “False” переменной WUR30Days
– попробуйте это вместо:
$WUR30Days -eq $false
Пример оператора присваивания (=
) вместо (-eq
) в условном выражении
Этот фрагмент показывает, как один знак равенства сбивает с толку, когда его используют в выражениях if
:
$ThisIsDefinitelyFalse = $(get-date).Day -gt 100
Write-Host $ThisIsDefinitelyFalse
Write-Host $ThisIsDefinitelyFalse.GetType()
if ($ThisIsDefinitelyFalse = "False") {
Write-Host "Что за фигня?!"
}
if ($ThisIsDefinitelyFalse = "True") {
Write-Host "Что за фигня?!?!"
}
Write-Host $ThisIsDefinitelyFalse
Write-Host $ThisIsDefinitelyFalse.GetType()
Вывод будет:
False
System.Boolean
Что за фигня?!
Что за фигня?!?!
True
System.String
Поскольку выражения внутри операторов if
возвращают факт, что они успешно присваивали переменную. Вы также можете увидеть, что переменная раньше была булевой, а теперь изменилась на строку. Это выражение внутри if
обновило значение переменной:
$ThisIsDefinitelyFalse = "True"
.
Ответ или решение
Как получить информацию о обновлениях Windows с помощью PowerShell
Вам необходимо собрать информацию о последних обновлениях Windows на ваших компьютерах в сети, чтобы определить, установлены ли обновления за последние 30 дней. Вы привели определенный код PowerShell, который не работает должным образом, и в этом руководстве мы разберем существующие проблемы и предложим решение.
1. Проблемы с вашим кодом:
Сравнение с сегодняшней датой
Ваш текущий код:
$WUpdateResult = (Get-Hotfix | Sort-Object -Property InstalledOn -Descending | Select-Object -First 1).InstalledOn
$WUR30Days = $WUpdateResult -lt 30
Здесь вы не сравниваете InstalledOn
с сегодняшней датой. Ваша цель – определить, прошло ли менее 30 дней с даты установки последнего обновления. Вам нужно использовать следующую конструкцию для правильного сравнения:
$WUpdateResult = (Get-Hotfix | Sort-Object -Property InstalledOn -Descending | Select-Object -First 1).InstalledOn
$daysDifference = (Get-Date) - $WUpdateResult
$WUR30Days = $daysDifference.Days -lt 30
Ошибка в конструкции if
Ваша исходная строка:
$info.WUpdateResult = if ($WUR30Days = "False") { $WUpdateResult } else { "N/A" }
Здесь вы используете оператор присваивания (=
) вместо оператора сравнения (-eq
). Это ошибка, которая приведет к изменению типа переменной. Исправьте это следующим образом:
$info.WUpdateResult = if (-not $WUR30Days) { $WUpdateResult } else { "N/A" }
2. Обновленный код
С учетом вышеуказанных исправлений ваш окончательный код должен выглядеть примерно так:
# Получение даты последнего обновления
$WUpdateResult = (Get-Hotfix | Sort-Object -Property InstalledOn -Descending | Select-Object -First 1).InstalledOn
# Проверка, сколько дней прошло с момента установки
$daysDifference = (Get-Date) - $WUpdateResult
$WUR30Days = $daysDifference.Days -lt 30
# Формирование итоговой информации
$info.WUpdateResult = if (-not $WUR30Days) { $WUpdateResult } else { "N/A" }
3. Пояснения по коду:
- Get-Hotfix: Команда, используемая для получения списка установленных обновлений Windows.
- Sort-Object: Сортирует обновления по дате установки в порядке убывания.
- Select-Object -First 1: Выбирает самое последнее обновление.
- Get-Date: Позволяет получить текущую дату и время.
- Разница во днях: Мы получаем количество дней, прошедших с момента установки обновления, и сравниваем это значение с 30 днями.
- Проверка с помощью
if
: Если обновление не было установлено более 30 дней назад, мы возвращаем дату установки, в противном случае выводим "N/A".
Заключение
Используя приведенный выше код, вы сможете эффективно отслеживать состояние обновлений на ваших машинах. Оптимизация и исправление ошибок приведут к тому, что ваша команда PowerShell будет работать как задумано. Следуйте данным инструкциям, и ваша задача по отслеживанию обновлений станет значительно проще. Если у вас возникнут дополнительные вопросы, не стесняйтесь обращаться за помощью.