我有多行重复的代码行,其中只有“办公室”名称应该不同,但是 $ 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
当我只需要更改部分条件时,如何避免每次手动插入此手册?
最佳答案
使用expandable string("..."
),而不是脚本块({ ... }
)
-Filter "(office -like 'ROFL') -and ( $paste )"
顺便说一句:由于'ROFL'
不是通配符表达式,因此与-like
相比,使用-eq
没有任何好处。这样,AD提供程序最终会看到以下过滤器,该过滤器应该可以按预期工作:
(office -like 'ROFL') -and ( extensionAttribute -eq 123 )
至于您尝试了什么:
在AD cmdlet的
{ ... }
参数中使用脚本块(-Filter
)很普遍,但是从概念上讲是有问题的:请参阅this answer。简而言之:
-Filter
参数是字符串类型的,当您将其传递给脚本块时,将传递其逐字内容(不包括{
和}
)。也就是说,在您的尝试中,AD提供程序将以下字符串逐字地视为
-Filter
参数:(office -like "ROFL") -and ( $paste )
-此字符串在语法上显然是错误的,因为您想在前面扩展(内插)的$paste
变量未扩展。使用
-Filter
时,请记住以下几点很重要:.ToString()
,从而产生其逐字内容。-Filter
参数支持的表达式语言类似于PowerShell,但它仅支持有限的运算符子集,并且受支持的运算符在某种程度上与PowerShell对应物的行为有所不同-再次参见this answer。$var
,但不能使用$var.Foo
-在这种情况下,请使用辅助变量。关于powershell - 将变量的原始内容粘贴到另一个命令的过滤器中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62659096/