You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改PowerShell脚本以处理变量中的多对象匹配问题

问题:PowerShell判断用户是否在合规策略列表中失败的解决方法

我尝试用以下脚本判断指定用户是否在保留合规策略的OneDrive成员列表中:

$Guid = "59041b96-c71d-436c-8297-7af5fcf4e22a"

$Members = Get-RetentionCompliancePolicy -identity $guid -DistributionDetail | Select -ExpandProperty OneDriveLocation | select name,displayname | sort displayname 

$User = "Humbert, Jason"

$ODPolicy = $members.displayname | Select-String -Pattern "Humbert, Jason"

if($User -like $ODPolicy){
    Write-host "USer $($USer.primarysmtpaddress) is in"
    #$OD.RetentionSet = $True
}else{
    Write-Warning "User $($USer.primarysmtpaddress) not in Policy"
}

执行后$ODPolicy返回两个相同的用户名称(因存在活跃和非活跃两个邮箱):

PS C:\Users\XYZ> $ODPolicy
Humbert, Jason
Humbert, Jason

但运行if($User -like $ODPolicy)时,脚本无法处理多个对象的情况,直接进入else分支输出警告。请问如何修改脚本,使条件判断为真并执行对应的成功输出?


解决方案

方法1:直接用集合包含检查(推荐)

跳过Select-String,直接用-contains操作符检查用户是否在displayname集合中,该操作符支持处理多元素集合,只要存在匹配就返回$true:

$Guid = "59041b96-c71d-436c-8297-7af5fcf4e22a"
$Members = Get-RetentionCompliancePolicy -Identity $guid -DistributionDetail | 
           Select-Object -ExpandProperty OneDriveLocation | 
           Select-Object name, displayname | 
           Sort-Object displayname 

$User = "Humbert, Jason"

if ($Members.displayname -contains $User) {
    Write-Host "用户 $User 在策略中"
    # $OD.RetentionSet = $True
}
else {
    Write-Warning "用户 $User 不在策略中"
}

方法2:检查Select-String的匹配结果

如果坚持使用Select-String,可以直接判断是否存在匹配结果(Select-String有匹配时返回对象,无匹配时返回$null),同时用[regex]::Escape()处理用户名称中的特殊字符,避免正则匹配异常:

$Guid = "59041b96-c71d-436c-8297-7af5fcf4e22a"
$Members = Get-RetentionCompliancePolicy -Identity $guid -DistributionDetail | 
           Select-Object -ExpandProperty OneDriveLocation | 
           Select-Object name, displayname | 
           Sort-Object displayname 

$User = "Humbert, Jason"

$ODPolicy = $members.displayname | Select-String -Pattern [regex]::Escape($User)

if ($ODPolicy) {
    Write-Host "用户 $User 在策略中"
    # $OD.RetentionSet = $True
}
else {
    Write-Warning "用户 $User 不在策略中"
}

注意:原脚本中$USer.primarysmtpaddress存在问题——$User是字符串变量,并没有primarysmtpaddress属性,所以直接使用$User即可;如果需要获取用户的邮箱属性,需先通过Get-User或Get-Mailbox等命令获取用户对象。


内容的提问来源于stack exchange,提问作者Chabango

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 20:35:18