Индексирование Powershell для создания имени пользователя для входа - PullRequest
0 голосов
/ 10 марта 2019

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

Я хочу, чтобы скрипт взял Firstname + Lastname[0], чтобы сделать имя для входа пользователей, но я не могуполучить правильный синтаксис, я попытался написать {} и (), но не повезло.это оригинальный мир из моего сценария

New-ADuser...........-UserPrincipalName $fname+$lname[0]

какие-нибудь советы?

Ответы [ 3 ]

1 голос
/ 11 марта 2019

Полезный ответ Габриэля Люси предоставляет эффективное решение и полезные указатели, но стоит покопаться глубже:

Ваша проблема в том, что вы пытаетесь передать выражение $fname+$lname[0] в качестве аргумента , что требует включения (...):

New-ADuser ... -UserPrincipalName ($fname+$lname[0])

PowerShell имеет два различных режима анализа , и когда вызывается команда (например, New-ADUser), PowerShell работает в режиме аргумент , в отличие от выражение режим.

Заключение аргумента в (...) вызывает новый контекст синтаксического анализа , который в случае $fname+$lname[0] вызывает его анализ в режиме expression , который выполняет требуемую строку конкатенация.

В режиме аргумент , без кавычек аргументы неявно обрабатываются так, как если бы они были заключены в "...", то есть как расширяемый Строки при следующих обстоятельствах :

  • Если они не начинаются с (, @, $( или @(.
  • Если они либо не начинаются со ссылки на переменную (например, $var), либо начинаются с нее, но за ними следуют другие символы, которые считаются частью одного и того же аргумента (например, $var+$otherVar).

Следовательно, $fname+$lname[0] оценивается так, как если бы было передано "$fname+$lname[0]":

  • + становится частью получающейся строки.
  • Кроме того, учитывая, что внутри "..." вы можете использовать только ссылки на переменные (например, $fname), но не выражений (например, $lname[0]), $lname[0] не будет работать как и предполагалось, поскольку часть [0] просто обрабатывается как литерал .

Внедрение выражения (или команды или даже нескольких выражений или команд) в "..." требует включения его в $(...), оператор подвыражения как в ответе Габриэля.

Обзор правил расширения строк PowerShell , см. этот ответ .


В следующих примерах используется командлет Write-Output для иллюстрации различных вариантов поведения:

$fname = 'Jane'
$lname = 'Doe', 'Smith'

# WRONG: Same as: "$fname+$lname[0]", which 
#         * retains the "+" 
#         * expands array $lname to a space-separated list
#         * treats "[0]" as a literal
PS> Write-Output -InputObject $fname+$lname[0]
Jane+Doe Smith[0]

# OK: Use an expression via (...)
PS> Write-Output -InputObject ($fname+$lname[0])
JaneDoe

# OK: Use an (implicit or explicit) expandable string.
PS> Write-Output -InputObject $fname$($lname[0]) # or: "$fname$($lname[0])"
JaneDoe


# OK: Use an intermediate variable:
PS> $userName = $fname + $lname[0]; Write-Output -InputObject $userName
1 голос
/ 11 марта 2019

Используйте строку для UserPrincipalName с переменными в строке:

New-ADuser -UserPrincipalName "$fname$($lname[0])"

PowerShell обычно может выяснить, когда вы помещаете переменную в строку. Когда это невозможно, как в случае $lname[0], вы заключаете его в $().

Это называется «раскрытием переменной» (другие языки, такие как C #, называют это «интерполяцией строк»). Вот хорошая статья, которая описывает это более подробно: https://powershellexplained.com/2017-01-13-powershell-variable-substitution-in-strings/

0 голосов
/ 11 марта 2019

Я только что увидел ответы и за минуту до того, как понял, что мне нужно установить ее в качестве другой переменной $logon = $fname+lname[0] и передать ее как -userPrincipalName $logon.

Спасибо за помощь, вы, пареньлучшее!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...