首页 > 解决方案 > 将变量的原始内容粘贴到另一个命令的过滤器中

问题描述

我有多个重复的代码行,其中只有“办公室”名称应该不同,但$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

当我只需要更改部分标准时,如何避免每次插入此手册?

标签: powershellactive-directory

解决方案


使用可扩展字符串( "..."),而不是脚本块 ( { ... })

-Filter "(office -like 'ROFL') -and ( $paste )"

顺便说一句:由于'ROFL'不是通配符表达式,因此使用-likeover没有任何好处-eq

这样,AD 提供者最终会看到以下过滤器,它应该可以按预期工作:(office -like 'ROFL') -and ( extensionAttribute -eq 123 )


至于你尝试了什么:

{ ... }使用带有 AD cmdlet参数的脚本块 ( )-Filter很普遍,但在概念上存在问题:请参阅此答案

简而言之:-Filter参数是string类型的,当你传递一个script block时,它的逐字内容- 不包括{an }- 被传递。

也就是说,在您的尝试中,AD 提供程序将以下字符串逐字-Filter视为参数: - 这个字符串显然在语法上不正确,因为您想要预先扩展(插值)的变量没有扩展。(office -like "ROFL") -and ( $paste )$paste

使用时-Filter,请务必记住:

  • 你总是会传递一个字符串作为参数;如果你传递一个脚本块,.ToString()首先调用它,产生它的逐字内容。

  • 使用脚本块可能会给人一种错误的印象,即您可以将任意 PowerShell 表达式作为过滤器传递,这是正确的:

    • 虽然参数支持的表达式语言类似于-FilterPowerShell ,但它仅支持有限的运算符子集,并且受支持的运算符的部分行为与其 PowerShell 对应物不同- 再次,请参阅此答案

    • 最显着的限制是您只能使用简单的变量引用(在使用隐式远程处理时甚至不能使用),而不是基于变量的表达式,例如属性访问;例如,您可以$var在过滤器中使用,但不能使用$var.Foo- 在这种情况下使用辅助变量。


推荐阅读