用于创建用户登录名的Powershell索引

时间:2019-03-10 19:25:24

标签: powershell active-directory

我正在尝试为公司制作用户创建脚本,以使事情更加自动化。

我希望脚本使用Firstname + Lastname[0]来命名用户登录名,但是我无法正确获取语法, 我试过写{}和(),但是没有运气。 那是我脚本中的原始和平感

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

任何提示?

3 个答案:

答案 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 模式下,将未加引号的参数隐式地视为 ,它们被括在"..."中,即,在以下情况下为可扩展字符串

  • 如果它们不是以(@$(@(开头。
  • 如果它们不是 not 以变量引用开头(例如$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传递。

感谢您的帮助,你们是最棒的!