如何写入托管 powershell 数组中元素的单个 属性?
How do I write-host a single property of an element in a powershell array?
我向 Office365 查询了与 Chris.
的显示名称匹配的所有用户的列表
我想提示用户他们想要哪个 Chris select。在这样做时,我有以下 for..each code
$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
我需要做哪些改动才能保证这个值真正写入一个值?
编者注:问题原来与此处发布的代码无关,原则上确实有效。
我认为你只需要用双引号括起来:
Write-Host "$i $($tmpUserOffice[$i].DisplayName)"
双引号允许您嵌入变量 $i
,$(...)
允许在显示之前计算值。
我们现在知道您的代码本身没有任何问题;此答案侧重于您对 Write-Host
.
的使用
您的 Write-Host
命令表明 您似乎认为并置表达式(例如 $i
)和字符串文字(例如 " selected"
)执行 string concatenation awk
的方式,例如(例如,$i " selected"
如果 $i
导致文字 1 selected
' s 值为 1
).
这是不是的情况:
白色space分隔的标记是单独的参数,Write-Host
通过分隔它们隐式连接每一个 space.
注意:此功能特定于 Write-Host
cmdlet; 其他 Write-*
cmdlet 的行为不同。
因为它们是单独的参数,所以您实际上 不需要 需要包含更复杂的表达式,例如 $tmpUserOffice[$i].DisplayName
in $(...)
以您的一个命令为例:
Write-Host $i " " $($tmpUserOffice[$i].DisplayName)
虽然这在原则上可行,但它:
在扩展表达式值之间以 3 spaces 结尾,因为 Write-Host
在在将 3 个参数与 spaces.
连接的过程中 " "
参数的任一侧
不必要地复杂:在这种情况下不需要 $(...)
。
您可能打算做什么:
Write-Host $i $tmpUserOffice[$i].DisplayName
警告:虽然上述语法方便,但它不是[=]的通用技术61=]组合字符串.
显示如何使用 字符串扩展(插值) 和单个双引号字符串 ("..."
) 预先组合输出字符串.
请注意,在 "..."
中,然后 do 需要 $(...)
才能嵌入 expressions纯粹的变量引用(例如,$var
)- 请参阅 this answer 了解更多信息。
我向 Office365 查询了与 Chris.
的显示名称匹配的所有用户的列表我想提示用户他们想要哪个 Chris select。在这样做时,我有以下 for..each code
$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
我需要做哪些改动才能保证这个值真正写入一个值?
编者注:问题原来与此处发布的代码无关,原则上确实有效。
我认为你只需要用双引号括起来:
Write-Host "$i $($tmpUserOffice[$i].DisplayName)"
双引号允许您嵌入变量 $i
,$(...)
允许在显示之前计算值。
我们现在知道您的代码本身没有任何问题;此答案侧重于您对 Write-Host
.
您的 Write-Host
命令表明 您似乎认为并置表达式(例如 $i
)和字符串文字(例如 " selected"
)执行 string concatenation awk
的方式,例如(例如,$i " selected"
如果 $i
导致文字 1 selected
' s 值为 1
).
这是不是的情况:
白色space分隔的标记是单独的参数,
Write-Host
通过分隔它们隐式连接每一个 space.
注意:此功能特定于Write-Host
cmdlet; 其他Write-*
cmdlet 的行为不同。因为它们是单独的参数,所以您实际上 不需要 需要包含更复杂的表达式,例如
$tmpUserOffice[$i].DisplayName
in$(...)
以您的一个命令为例:
Write-Host $i " " $($tmpUserOffice[$i].DisplayName)
虽然这在原则上可行,但它:
在扩展表达式值之间以 3 spaces 结尾,因为
Write-Host
在在将 3 个参数与 spaces. 连接的过程中 不必要地复杂:在这种情况下不需要
$(...)
。
" "
参数的任一侧
您可能打算做什么:
Write-Host $i $tmpUserOffice[$i].DisplayName
警告:虽然上述语法方便,但它不是[=]的通用技术61=]组合字符串.
"..."
) 预先组合输出字符串.
请注意,在 "..."
中,然后 do 需要 $(...)
才能嵌入 expressions纯粹的变量引用(例如,$var
)- 请参阅 this answer 了解更多信息。