我向Office365查询了与 Chris 的displayName相匹配的所有用户的列表。
我想提示用户他们要选择哪个克里斯。为此,我有以下for..each代码
$tmpUserOffice = Get-MsolUser -SearchString "*Chris*"
if ($tmpUserOffice -is [array])
{
if ($tmpUserOffice.Count -lt 50) {
Write-Host "Many matching users in MSOL. Choose which one you want to save"
for ($i = 0; $i -lt $tmpUserOffice.Count; $i++) {
Write-Host $i " " $($tmpUserOffice[$i].DisplayName)
}
Write-Host $tmpUserOffice.Count " None of the above"
$chosen = Read-Host
if ($chosen -eq $tmpUserOffice.Count) {
Write-Warning "Nothing found. Try searching with different criteria or use wildcards"
Write-Output $null
}
Write-Host $tmpUserOffice[$chosen] " selected"
$tmpUserOffice = $tmpUserOffice[$chosen]
exit
}
else {
Write-Warning "More than 50 matches found. Try searching for more specific criteria"
}
}
我的问题之一是如何获取以下行的内容
Write-Host $i " " $($tmpUserOffice[$i].DisplayName)
当前输出为
Many matching users in MSOL. Choose which one you want to save
0
1
2 None of the above
我需要进行哪些更改以确保该值实际写入一个值?
编者注:该问题与此处发布的代码无关,该代码原则上是可行的。
答案 0 :(得分:1)
我们现在知道您的代码本身没有错;该答案重点在于您对Write-Host
的使用。
您的Write-Host
命令表明您似乎认为并置表达式(例如$i
)和字符串文字(例如" selected"
)执行 string 串联,例如awk
的执行方式(例如,如果$i " selected"
的值为1 selected
,则$i
会产生文字1
)。
情况并非如此:
以空格分隔的标记是个自变量,Write-Host
通过将它们彼此分隔开一个单独的空格来隐式连接。
注意:此功能特定于Write-Host
cmdlet; 其他Write-*
cmdlet的行为有所不同。
因为它们是单独的参数,所以您实际上不需要在$tmpUserOffice[$i].DisplayName
$(...)
>
以您的一个命令为例:
Write-Host $i " " $($tmpUserOffice[$i].DisplayName)
虽然这原则上可行,但它:
最终在扩展表达式值之间有 3 个空格,因为Write-Host
在连接" "
参数的两侧插入了一个空格。 3个带空格的参数。
不必要地复杂:在这种情况下不需要$(...)
。
您可能打算做什么:
Write-Host $i $tmpUserOffice[$i].DisplayName
注意事项:虽然上述语法很方便 ,但这不是组成字符串 。
HAL9256's answer显示了如何将 字符串扩展(插值)与单个双引号字符串("..."
)结合使用,以编写输出字符串 upfront 。
请注意,在"..."
内,您要做需要$(...)
,以便嵌入超出单纯的变量引用(例如{{ 1}})-有关更多信息,请参见this answer。
答案 1 :(得分:0)
我认为您只需将其用双引号引起来即可:
Write-Host "$i $($tmpUserOffice[$i].DisplayName)"
双引号允许您嵌入变量$i
,而$(...)
允许在显示值之前对其求值。