PowerShell方法包含无法正常工作

时间:2019-08-14 15:29:57

标签: powershell

我对PowerShell还是很陌生,我需要准备一些PowerShell命令来为用户分配Exchange Online中的某些角色。我首先需要检查是否已为用户分配了角色,否则,将分配角色。但是我只是不知道如何检查一个电子邮件地址是否属于电子邮件地址列表。

我发现许多关于-contains.Contains方法的讨论都没有用,但是他们的解决方案对我却没有用。我的代码在下面。

$L1Group = Get-MsolGroup | Where-Object { $_.DisplayName -eq "TEST_GROUP"}
$L1Members = Get-MsolGroupMember -GroupObjectId $L1Group.ObjectId
$CurrentMembers = Get-RoleGroupMember "Recipient Management" |
                  Select -Property WindowsLiveID
foreach ($user in $L1Members) {
    if (!$CurrentMembers.Contains($user.EmailAddress)) {  
        Add-RoleGroupMember "Recipient Management" -Member $user.EmailAddress
    }
}

无需使用if语句就可以正常工作,并且可以按预期分配角色,但是我需要跳过已经是角色组成员的用户。我只是想不出如何使if语句起作用。如果我使用echo $CurrentMembers,它将返回4个电子邮件地址的列表,与预期的一样,即使我尝试

$CurrentMembers -contains 'MyEmail@MyDomain.com'

它总是返回False,但是地址在列表中。

3 个答案:

答案 0 :(得分:0)

这是一个常见问题。 .contains和-contains不同。 $ CurrentMembers可能包含子属性。

(\S+)

这有效吗?另一个常见的问题是如何仅从属性中获取值。

PS C:\Users\admin\foo> 'hi there'.contains('hi')
True
PS C:\Users\admin\foo> 'hi','there' -contains 'hi'
True

嗯,有趣的是.contains()如何与数组一起工作。它更像-包含。更混乱了!

if (! ($CurrentMembers.windowsliveid -Contains $user.EmailAddress) )

答案 1 :(得分:0)

解决方案在注释中-“选择-属性WindowsLiveID->选择-扩展WindowsLiveID”

– 2小时前的Ansgar Wiechers

希望Angsar会发布答案,以便他能获得荣誉...

以下是Select-Object cmdlet的M $ oft文档的链接:

https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/select-object?view=powershell-6

答案 2 :(得分:0)

您的代码无法按您期望的方式运行,因为此语句

$CurrentMembers = Get-RoleGroupMember "Recipient Management" |
                  Select -Property WindowsLiveID

产生具有单个属性WindowsLiveID的自定义对象的列表,但是您的检查需要一个字符串列表。展开属性以获取该字符串列表:

$CurrentMembers = Get-RoleGroupMember "Recipient Management" |
                  Select -Expand WindowsLiveID