PowerShell 5.1:遍历AD计算机对象时如何引用Select选择的属性列
解决PowerShell中AD计算机对象属性访问的问题
首先直接给你简化后的代码,完全不需要用Select-ExpandProperty:
$OU=@('OU=...') $computers = $OU | foreach { Get-ADComputer -filter { Name -notlike 'xxx*' -and Name -notlike 'yyy*' } -searchbase $_ -Properties description | Select-Object name, description } foreach ($computer in $computers) { # 直接用点表示法访问属性 Write-Host "Host: $($computer.name) [$($computer.description)]" }
为什么你之前用点表示法没生效?
你提到尝试$computer.name但被当文本处理,大概率是字符串插值的问题:
当你在双引号字符串里直接写"Host: $computer.name"时,PowerShell会把$computer解析为变量,然后把.name当成普通文本拼接,结果就会输出类似Host: @{name=ABCDE12345; ...}.name的内容,让你误以为点表示法没用。
解决这个问题的关键是用**子表达式$()**把属性访问包裹起来,告诉PowerShell先执行$computer.name的属性获取操作,再把结果插入到字符串中。
额外的简化小技巧
如果你不需要单独保存$computerName和$computerDescription这两个变量,直接在Write-Host里用子表达式引用属性就足够了,像上面的代码那样,能让你的脚本更简洁。
另外你看到的@{name=ABCDE12345; description=Kiosk PC [Domain Separated]}只是PowerShell对这个自定义对象的默认字符串展示形式,并不是变量的实际结构——这个对象确实包含name和description两个可直接访问的属性,点表示法本身是完全有效的。
内容的提问来源于stack exchange,提问作者Brien Malone
相关产品推荐
相关产品推荐

