如何在Powershell数组中写入托管元素的单个属性?

时间:2018-08-03 20:32:46

标签: powershell write-host

我向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

我需要进行哪些更改以确保该值实际写入一个值?

编者注:该问题与此处发布的代码无关,该代码原则上是可行的。

2 个答案:

答案 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,而$(...)允许在显示值之前对其求值。