PowerShell脚本如何提取属性存为变量以构建DFSR backlog查询命令
PowerShell提取对象属性赋值的最优实现(适配DFSR批量查询场景)
针对你批量查询DFSR backlog的使用场景,最优实现根据提取属性的数量、校验需求分三类,优先选写法简洁、执行效率高的方案:
1. 提取单个属性(最常用)
直接用点表示法即可,这是PowerShell原生支持的最高效的属性提取方式,不需要额外管道操作:
# 先查询得到DFSR对象 $replicationGroup = Get-DfsReplicationGroup -ComputerName $当前服务器名 # 直接提取属性赋值 $rgName = $replicationGroup.GroupName
如果查询结果返回多个对象,点表示法会自动返回所有对象对应属性的数组,不需要手动循环:
# 直接拿到该服务器下所有复制组的名称数组 $allRgNames = (Get-DfsReplicationGroup -ComputerName $当前服务器名).GroupName
2. 需要校验属性存在性的场景
如果要避免属性不存在返回空值导致后续拼接dfsrdiag命令出错,用Select-Object -ExpandProperty,可以主动抛出错误方便排查:
# 属性不存在时会直接报错,避免后续空变量问题 $connName = Get-DfsReplicationConnection -ComputerName $当前服务器名 | Select-Object -ExpandProperty Name -ErrorAction Stop
3. 批量提取多个属性存储
你需要同时存复制组名、源/目标服务器、复制文件夹名多个属性拼接命令的话,直接用Select-Object构造自定义对象数组,后续遍历直接调用属性即可,完整示例如下:
# 读取服务器列表 $serverList = Get-Content .\服务器列表.txt # 批量查询并存储所有需要的属性 $dfsrConnInfo = foreach ($server in $serverList) { Get-DfsReplicationConnection -ComputerName $server | Select-Object ` ReplicationGroupName, ReplicationFolderName, @{Name = "SourceServer"; Expression = { $_.SourceComputerName } }, @{Name = "TargetServer"; Expression = { $_.DestinationComputerName } } } # 遍历拼接dfsrdiag命令查询backlog foreach ($conn in $dfsrConnInfo) { $backlogRes = dfsrdiag backlog /RGName:"$($conn.ReplicationGroupName)" /RFName:"$($conn.ReplicationFolderName)" /SendingMember:$($conn.SourceServer) /ReceivingMember:$($conn.TargetServer) # 自行处理返回的backlog结果即可 }
注意事项
- 不要用
ForEach-Object循环单独取属性赋值,批量场景下性能远低于上述方案 - 拼接
dfsrdiag参数时,如果复制组/文件夹名包含空格,一定要给参数值加双引号,避免命令解析错误
内容的提问来源于stack exchange,提问作者Woodsy
相关产品推荐
相关产品推荐

