Powershell过滤属性值而不扩展属性名称

时间:2020-04-01 19:08:49

标签: powershell dbatools

是否可以在不使用-expandproperty角色的情况下过滤“ Roles”属性?第一组语句向我显示了我所需的内容,但无法过滤Roles -eq“ db_owner”和users -ne“ user3”

#import-module dbatools
$servers = server1,server2
Get-DbaDatabase -SqlInstance $servers -Status Normal | Select SQLInstance,  Name, Owner,Roles, Users 

Results:
SqlInstance : server1
Name        : testdb
Owner       : sa
Roles       : {db_accessadmin, db_backupoperator, db_datareader, db_datawriter, db_ddladmin, db_denydatareader, db_denydatawriter, 
              db_owner, db_securityadmin, public}
Users       : {user1,user2,user3}

如果我再执行一条语句 Get-DbaDatabase -SqlInstance $servers -Status Normal | select -expandproperty Roles| Where Name -eq 'db_owner',db_owner的属性现在称为“名称”,它将在“ Roles” -eq db_owner处返回结果。

但是,现在它缺少了我在第一条语句中需要的其他属性。我是否必须使用数组存储每个语句的值,然后将结果结合在一起,还是有另一种方法可以过滤“角色”中的属性值?

“角色”的属性 名称MemberType定义


角色属性Microsoft.SqlServer.Management.Smo.DatabaseRoleCollection角色{get;}

IsPublic IsSerial名称BaseType
-------- -------- ---- --------
真假PSCustomObject System.Object

2 个答案:

答案 0 :(得分:1)

您反对使用ForEach-Object吗?

以下脚本应返回您所需的信息。然后,您可以根据需要进一步过滤这些结果。

Get-DbaDatabase -SqlInstance $servers -Status Normal | ForEach-Object -Process {
    [PSCustomObject]@{
        SqlInstance = $_.SqlInstance
        Name = $_.Name
        Owner = $_.Owner
        Roles = $_.Roles | Where-Object Name -eq 'db_owner'
        Users = $_.Users | Where-Object Name -ne 'user3'
    }
}

答案 1 :(得分:0)

$servers = server1,server2
Get-DbaDatabase -SqlInstance $servers -Status Normal | Select SQLInstance,  Name, Owner,Roles, Users | Where-Object { (@($_.Roles)) -contains 'db_owner' }

假设Roles属性返回的是基本数组类型(由于没有可用的env,我无法检查),则可以使用-contains运算符查看数组中是否包含字符串值。

如果Roles属性是基本Collection类型(可以使用.GetType()进行检查),则可以通过将集合包装为数组符号来显式地将Collections强制转换为Arrays:... | Where-Object { (@($_.Roles)) -contains 'db_owner' }