Hop*_*00b 2 variables powershell properties object
与关于如何正确构造参数参数的这个梦幻般的答案相关-Filter,我正在研究一个在PowerShell中大量使用Active Directory cmdlet的脚本,并且很难构造包含对象变量属性的过滤器参数.
该脚本基本上通过读取电子表格并根据需要处理每一行来管理通讯组 - 创建Active Directory联系人(如果它们不存在),将其添加或删除到适当的组等等.
电子表格存储在一个对象数组中,每一行都被视为一个对象,其中的列定义了对象属性.
例如,以下代码获取导入的电子表格的每一行,并尝试在Active Directory中查找匹配的联系人对象.
Foreach ($contact in $NOClist)
{
$contactobject = Get-ADObject -filter ("name -eq `"$contact.name`" -and Objectclass -eq `"contact`"") -SearchBase "$NOCContactPath" -Server $ADServer;
#... do some more stuff.
}
Run Code Online (Sandbox Code Playgroud)
问题在于按$contact.name字面意思进行评估,因此最终在Active Directory中搜索具有名称属性的联系人$contact.name.我已经试过其他的变化在前面参考答案,( ""$contact.name"",'$contact.name'和"' + $contact.name + '"),但他们都要么评估字面$contact.name或扔在一个语法错误.的字符.
我提出的hacky解决方法是将对象属性分配给变量并使用它,例如下面的,但这只是感觉很糟糕.
Foreach ($contact in $NOClist)
{
$contactname = $contact.name;
$contactobject = Get-ADObject -filter ("name -eq `"$contactname`" -and Objectclass -eq `"contact`"") -SearchBase "$NOCContactPath" -Server $ADServer;
#... do some more stuff.
}
Run Code Online (Sandbox Code Playgroud)
有没有办法在filter参数中引用一个对象属性,或者这种方法是将它分配给一个变量然后使用变量真的是最好的方法吗?
PowerShell只对字符串进行简单的变量扩展,没有索引或点属性访问等复杂的东西.有几种方法可以解决这个限制,例如
级联:
-Filter ("name -eq '" + $contact.name + "' -and Objectclass -eq 'contact'")
Run Code Online (Sandbox Code Playgroud)子表达式:
-Filter "name -eq '$($contact.name)' -and Objectclass -eq 'contact'"
Run Code Online (Sandbox Code Playgroud)格式运算符:
-Filter ("name -eq '{0}' -and Objectclass -eq 'contact'" -f $contact.name)
Run Code Online (Sandbox Code Playgroud)请注意,对于第一种和第三种方法,您需要将操作放在分组表达式中(即括号中),以便将该操作的结果传递给参数.