Я не уверен, что мне не хватает. Этот powershell, кажется, работает противоположно тому, что я ожидаю. Кто-нибудь знает, почему?

$loadUserProfileValue = Get-ItemProperty "IIS:\AppPools\.net v4.5" -Name processModel.loadUserProfile.Value
    Write-Host "Value: $loadUserProfileValue"
    IF ($loadUserProfileValue -eq "False") {
            Write-Host "Since Load User Profile is False, we will now set it to True"}

Вот мой вывод, когда загрузка профиля пользователя верна

Value: True
Since Load User Profile is False, we will now set it to True

Вот мой вывод, когда загрузка профиля пользователя имеет значение False

Value: False

Значение подбирается правильно. Переменная $loadUserProfileValue верна. Заявление IF работает противоположно тому, что я ожидаю.

Я могу заменить его на -ne "True" и, похоже, это работает... но почему -eq "False" НЕ работает?

0
ecksfiftyone 2 Фев 2022 в 17:21
1
Каков результат $loadUserProfileValue.GetType()? Если это строка, возможно ли, что в конце строки есть пробел (ПРОБЕЛ, TAB и т. д.)?
 – 
lit
2 Фев 2022 в 17:37
Лит поднимает хороший вопрос. Если это значение типа string, а не boolean, вы можете использовать метод .Trim(), чтобы избавиться от начальных и конечных «белых» пробелов.
 – 
Abraham Zinala
2 Фев 2022 в 17:40

2 ответа

Лучший ответ

В PowerShell вы используете логический тип данных, например: True = $true и False = $false.

В вашем случае вы должны изменить False на $false

$loadUserProfileValue = Get-ItemProperty "IIS:\AppPools\.net v4.5" -Name processModel.loadUserProfile.Value
Write-Host "Value: $loadUserProfileValue"
IF ($loadUserProfileValue -eq $false) {
        Write-Host "Since Load User Profile is False, we will now set it to True"}

На Stack Overflow уже есть вопрос по этой теме: Вопрос

1
DarkCode666 2 Фев 2022 в 17:44

Вы проверяете строковое значение false, когда свойство, скорее всего, возвращает логическое значение. Преобразователь типов PowerShell, вероятно, отвечает за то, что это не вызывает ошибку.

Измените свой тест, чтобы использовать $false вместо «false» и посмотрите, решит ли это проблему. Вот отличная статья по этому поводу:

https://devblogs.microsoft.com/powershell/boolean-values-and-operators/

EDIT: вы можете (и должны) всегда проверять тип данных возвращаемого объекта, и вы можете сделать это с помощью унаследованного метода для всех объектов, .gettype(). Для вашего кода это будет: $loadUserProfileValue.gettype(), и он сообщит вам, является ли возвращенный объект логическим, строковым и т. д.

1
thepip3r 2 Фев 2022 в 21:19