如何写入托管 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 了解更多信息。