powershell - 将变量的原始内容粘贴到另一个命令的过滤器中

标签 powershell active-directory

我有多行重复的代码行,其中只有“办公室”名称应该不同,但是 $ 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(),从而产生其逐字内容。
  • 使用脚本块可能会给人一种错误的印象,即您可以将任意PowerShell表达式作为过滤器进行传递,这是不正确的:
  • 虽然-Filter参数支持的表达式语言类似于PowerShell,但它仅支持有限的运算符子集,并且受支持的运算符在某种程度上与PowerShell对应物的行为有所不同-再次参见this answer
  • 最显着的限制是,您只能使用简单的变量引用(使用隐式远程处理时甚至不能使用),不能使用基于变量的表达式,例如属性访问。例如,您可以在过滤器中使用$var,但不能使用$var.Foo-在这种情况下,请使用辅助变量。

  • 关于powershell - 将变量的原始内容粘贴到另一个命令的过滤器中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62659096/

    相关文章:

    powershell - 从开始作业将脚本 block 重构为不同的功能

    windows - 在本地事件目录上不能嵌套另一个组的组成员

    c# - 如何确保 IsInRole 检查不使用缓存的凭据

    java - Liquibase Windows MySQL-找不到数据库驱动程序: com. mysql.cj.jdbc.Driver

    powershell - Measure-Command 报告的时间不准确?

    powershell - 更改 ConvertFrom-CSV 对象的类型

    azure - Azure CLI 和 Powershell cmdlet 之间的功能不一致

    c++ - 从 Exchange Server 2003 获取信息?

    vbscript - 使用备用凭据通过 VBscript 保护 LDAP 对象操作

    azure - 当范围不是 Azure AD 中的图形 API 时,如何添加自定义声明并检索相同的声明作为 access_token 的一部分?