Преобразование строки в логическое значение в PowerShell при импорте данных из файла CSV - PullRequest
0 голосов
/ 06 февраля 2019

Я мигрирую локальную среду Exchange в Office 365 и в настоящее время пытаюсь выполнить сценарий некоторых задач миграции.Одна из задач, в частности, состоит в том, чтобы экспортировать группы и членов групп в CSV из локальной среды, а затем импортировать данные CSV в Office 365.

Я создал следующий сценарий, чтобы попытаться импортировать группы в Office365:

# Import distribution groups from CSV to Office 365
Import-Csv c:\admin\exchange-migration\exports\distribution-groups.csv | foreach {
    New-DistributionGroup -Name $_.name -Alias $_.alias -PrimarySmtpAddress $_.primarysmtpaddress -Type Distribution -RequireSenderAuthenticationEnabled ([System.Convert]::ToBoolean($_.requiresenderauthenticationenable))
}

У меня были проблемы с частью "requiresenderauthenticationenabled", потому что я не смог преобразовать строку в логическое значение, но после некоторых исследований я выбрал вариант [System.Convert].Однако теперь каждое значение рассматривается как ЛОЖЬ.

Here's my CSV

1 Ответ

0 голосов
/ 06 февраля 2019

Матиас Р. Джессен предоставил критический указатель:

У вас было опечатка в имени свойства , которую вы передали [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"

К сожалению, однако, этот строгий режим имеет потенциально нежелательные побочные эффекты:

  • Его эффект не лексический и, следовательно, может повлиять на выполнение кода, который не был разработан с учетом этого режима - есть в ожидании RFC , чтобы изменить это.

  • Это предотвращает использование свойств .Count / .Length для скаляров , которые важны для унифицированной обработки коллекций и скаляров.
    Если вы тоже недовольныОписанное там поведение заставит вас услышать ваш голос.


Помимо опечатки, более простой способ форсировать строковое значение, которое либо 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 - обратите внимание на обязательное : между именем переключателя и логическим значением.
...