是否可以在不使用-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
答案 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' }
>