1

我向 Office365 查询了与Chris的 displayName 匹配的所有用户的列表。

我想提示用户他们想要选择哪个 Chris。在这样做时,我有以下 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

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

编者注:问题结果与此处发布的代码无关,原则上确实有效。

4

2 回答 2

2

我们现在知道您的代码本身没有问题;此答案侧重于您对Write-Host.

您的Write-Host命令表明您似乎认为并列表达式(例如,$i)和字符串文字(例如," selected")执行字符串连接的方式,awk例如(例如,$i " selected"导致文字1 selectedif$i的值是1)。

情况并非如此

  • 空格分隔的标记是单独的 arguments,它们通过使用单个空格 eachWrite-Host分隔它们来隐式连接。 注意:此功能特定于cmdlet;其他cmdlet 的行为不同。
    Write-HostWrite-*

  • 因为它们是单独的参数,所以您实际上不需要$tmpUserOffice[$i].DisplayName包含更复杂的表达式,例如$(...)

以您的一个命令为例:

Write-Host $i " "  $($tmpUserOffice[$i].DisplayName)

虽然这在原则上有效,但它:

  • 最终在扩展表达式值之间有3 个空格,因为在将 3 个参数与空格连接的过程中,Write-Host在参数的任一侧插入了一个空格。" "

  • 是不必要的复杂:$(...)在这种情况下不需要。

你可能打算做什么:

Write-Host $i $tmpUserOffice[$i].DisplayName

警告:虽然上述语法很方便,但它不是用于组合字符串的通用技术

HAL9256 的回答显示如何使用带有单个双引号字符串 ( )的字符串扩展(插值)来预先组合输出字符串"..."

请注意,"..."确实需要$(...)在内部嵌入超出单纯变量引用的表达式$var(例如, )-有关更多信息,请参见此答案

于 2018-08-03T21:11:25.120 回答
2

我认为您只需要用双引号将其括起来:

Write-Host "$i  $($tmpUserOffice[$i].DisplayName)"

双引号允许您嵌入变量$i,并且$(...)允许在显示之前对值进行评估。

于 2018-08-03T20:40:46.570 回答