我有多行重复的代码行,其中只有“办公室”名称应该不同,但是$ paste变量中的条件应该相同。
$paste = "extensionAttribute -eq 123"
$users1 = get-aduser -Properties canonicalName -filter {(office -like "ROFL") -and ( $paste )}
$users2 = get-aduser -Properties canonicalName -filter {(office -like "BOFL") -and ( $paste )}
当我尝试这样做时(插入$ paste变量的内容),我收到这种错误:
get-aduser : Error parsing query: '(office -like "ROFL") -and ( $paste )' Error Message: 'syntax error'
at position: '47'.
At line:1 char:10
+ $users = get-aduser -Properties canonicalName...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ParserError: (:) [Get-ADUser], ADFilterParsingException
+ FullyQualifiedErrorId : ActiveDirectoryCmdlet:Microsoft.ActiveDirectory.Management.ADFilterParsingException,Microsoft.ActiveDirectory.Management.Commands.GetADUser
当我只需要更改部分条件时,如何避免每次手动插入此手册?
使用可扩展字符串("..."
),而不是脚本块({ ... }
)
-Filter "(office -like 'ROFL') -and ( $paste )"
顺便'ROFL'
说一句:由于不是通配符表达式,所以使用-like
over没有好处-eq
。
这样,AD提供程序最终会看到以下过滤器,该过滤器应该可以正常工作: (office -like 'ROFL') -and ( extensionAttribute -eq 123 )
至于你尝试了什么:
{ ... }
带有AD cmdlet-Filter
参数的脚本块()的使用很普遍,但从概念上讲是有问题的:请参阅此答案。
简而言之:该-Filter
参数是字符串类型的,当您将其传递给脚本块时,将传递其逐字内容(不包括{
an }
)。
也就是说,在您的尝试中,AD提供程序将以下字符串视为逐字自-Filter
变量:-且该字符串在语法上显然不正确,因为您要在前面扩展(内插)的变量未扩展。(office -like "ROFL") -and ( $paste )
$paste
使用时-Filter
,请记住以下几点很重要:
您将始终传递一个字符串作为参数。如果传递脚本块,.ToString()
则会首先对其进行调用,从而产生其逐字内容。
使用脚本块可能会给人一种错误的印象,即您可以将任意PowerShell表达式作为过滤器传递,这是不正确的:
尽管该-Filter
参数支持的表达式语言类似于PowerShell ,但是它仅支持有限的一部分运算符,并且受支持的运算符在某种程度上与PowerShell对应物的行为有所不同-再次参见此答案。
最明显的限制是只能使用简单的变量引用(使用隐式远程处理时甚至不能使用),不能使用基于变量的表达式,例如属性访问;例如,您可以$var
在过滤器中使用,但不能使用$var.Foo
-在这种情况下,请使用辅助变量。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句