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