我正在尝试为公司制作用户创建脚本,以使事情更加自动化。
我希望脚本使用Firstname + Lastname[0]
来命名用户登录名,但是我无法正确获取语法,
我试过写{}和(),但是没有运气。
那是我脚本中的原始和平感
New-ADuser...........-UserPrincipalName $fname+$lname[0]
任何提示?
答案 0 :(得分:1)
为UserPrincipalName
使用字符串,字符串中包含变量:
New-ADuser -UserPrincipalName "$fname$($lname[0])"
当您将变量放在字符串中时,PowerShell通常可以弄清楚。如果不能,例如$lname[0]
,则将其包含在$()
中。
这称为“变量扩展”(其他语言,如C#,称为“字符串插值”)。这是一篇很好的文章,对它进行了更详细的描述:https://powershellexplained.com/2017-01-13-powershell-variable-substitution-in-strings/
答案 1 :(得分:1)
Gabriel Luci's helpful answer提供了有效的解决方案和有用的指导,但值得深入研究:
您的问题是您正试图将表达式 $fname+$lname[0]
作为自变量传递,这需要包含(...)
:
New-ADuser ... -UserPrincipalName ($fname+$lname[0])
PowerShell具有两个截然不同的parsing modes,并且当调用命令(例如New-ADUser
)时,PowerShell在 参数中运行模式,而不是表达式模式。
在(...)
中括入一个参数会强制使用新的解析上下文,对于$fname+$lname[0]
来说,这会导致它以 expression 模式进行解析,执行所需的字符串连接。
在 argument 模式下,将未加引号的参数隐式地视为 ,它们被括在"..."
中,即,在以下情况下为可扩展字符串 :
(
,@
,$(
或@(
开头。$var
),还是以一个变量引用开头,但是后面跟随被视为同一参数一部分的其他字符(例如$var+$otherVar
)。因此,$fname+$lname[0]
的评估就好像已经传递了"$fname+$lname[0]"
:
+
成为结果字符串的一部分。"..."
内部您只能使用变量引用(例如$fname
),而不能使用表达式(例如$lname[0]
), $lname[0]
也无法按预期工作,因为[0]
部分只是被视为 literal 。在"..."
中嵌入表达式(或 command 甚至 multiple 表达式或命令)要求将其包含在{{ 1}},子表达式运算符,如Gabriel的答案。
有关 PowerShell的字符串扩展规则的概述,请参见this answer。
以下示例使用$(...)
cmdlet来说明不同的行为:
Write-Output
答案 2 :(得分:0)
我刚刚看到答案和一分钟,然后才意识到我应该将其设置为另一个变量$logon = $fname+lname[0]
并将其作为-userPrincipalName $logon
传递。
感谢您的帮助,你们是最棒的!