如何在Foreach循环中查询ADComputer的ManagedBy属性?

时间:2015-06-11 16:55:53

标签: powershell active-directory

我正在尝试生成特定PDL拥有的计算机列表,但我遇到了一些语法问题:

$group = Get-ADGroupMember -Identity "pdl" | Select-Object -ExpandProperty DistinguishedName
Foreach($item in $group) { Get-ADComputer -Filter "ManagedBy -eq "$item"" -Property managedby | Select Name }

第二部分基于我在其他地方找到的另一个代码片段(我认为在StackOverflow上也是如此),它运行得很好:

Get-ADComputer -Filter "ManagedBy -eq 'CN=user@company.com,OU=US,OU=Users,OU=Accounts,DC=americas,DC=company,DC=com'" -Property ManagedBy

但区别在于我可以在这个中使用'',但添加$ item会阻止我使用它。

我使用第一个代码段返回的语法错误:

Get-ADComputer : A positional parameter cannot be found that accepts argument 'CN=user@company.com,OU=US,OU=Users,OU=Accounts,DC=americas,DC=company,DC=com'.
At D:\Documents\Scripts\uatgroup.ps1:2 char:31
+ Foreach($item in $UATgroup) { Get-ADComputer -Filter "ManagedBy -eq "$item"" -Pr ...
+                               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Get-ADComputer], ParameterBindingException
    + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.ActiveDirectory.Management.Commands.GetADComputer

有人知道修复语法的方法吗?或者另一种运行方法吗?

1 个答案:

答案 0 :(得分:0)

此:

"ManagedBy -eq "$item""

被解析为三个单独的字符串。只有第一个(ManagedBy -eq)绑定到-Filter参数,其余的将被视为单独的令牌,导致PowerShell抱怨您不能保留字符串{{1在所有事物的中间。

您可以在双引号字符串中使用单引号,以避免提前终止字符串:

CN=...

使用反引号(Get-ADComputer -Filter "ManagedBy -eq '$item'" )转义内联双引号:

`

或者通过加倍来逃避它们:

Get-ADComputer -Filter "ManagedBy -eq `"$item`""