Матиас Р. Джессен предоставил критический указатель:
У вас было опечатка в имени свойства , которую вы передали [System.Convert]::ToBoolean()
, что вызвало свойствоссылка всегда оценивается как $null
, который метод .NET всегда преобразует в $false
.
В предотвращают такие опечатки в будущем, вы можете установить Set-StrictMode -Version 2
или выше,которая сообщит об ошибке завершения оператора, если ссылается на неинициализированную переменную или несуществующее свойство:
Set-StrictMode -Version 2
# Try to reference a nonexistent property on an input object.
[pscustomobject] @{ one = 1; two = 2; three = 3 } | % { $_.four }
# -> Error "The property 'four' cannot be found on this object.
# Verify that the property exists"
К сожалению, однако, этот строгий режим имеет потенциально нежелательные побочные эффекты:
Помимо опечатки, более простой способ форсировать строковое значение, которое либо true
или false
(в любом случае) соответствующему логическому значению - -eq 'true'
;Например:
... -RequireSenderAuthenticationEnabled ($_.requiresenderauthenticationenabled -eq 'true')
Тем не менее, это надежно, только если вы можете полагаться на значения свойств, ограниченные строкой 'true'
и 'false'
- вы не поймете неожиданные значения, которыеНапример, 'yes'
.
Кроме того, New-DistributionGroup
с использованием параметров [bool]
вместо параметров [switch]
является неудачным отклонением от PowerShell.условные обозначения .
Если бы -RequireSenderAuthenticationEnabled
были правильно введены как [switch]
:
Вместо
-RequireSenderAuthenticationEnabled $true
, вы бы просто передали имя коммутатора:
-RequireSenderAuthenticationEnabled
и вместо
-RequireSenderAuthenticationEnabled $false
вы бы:
- обычно просто пропустите переключатель
- но если вы строите аргументы программно через логическое значение, хранящееся в переменной, вы должны использовать
-RequireSenderAuthenticationEnabled:$var
- обратите внимание на обязательное :
между именем переключателя и логическим значением.