【问题标题】:Wildcard with variable in Get-ADUserGet-ADUser 中带有变量的通配符
【发布时间】:2012-09-25 11:54:47
【问题描述】:

我确定这只是一个语法错误,但我试图搜索 AD 用户,但我不知道为什么这不起作用:

Write-Host "Enter LastName or UserName:"
$x = Read-Host
Get-ADUser -Filter { SAMAccountName -like '*$x*' } -Properties DispalyName | FT -Properties DisplayName

只是不返回任何东西。我确定它是带有“*”的语法。但不知道为什么。感谢您的帮助。

【问题讨论】:

    标签: powershell


    【解决方案1】:

    试着改变这个:

    { SAMAccountName -like "*$x*" }
    

    编辑:

    这应该可行:

    $x = '*' + $(Read-Host 'Enter name') + '*'
    get-aduser -Filter {name -like $x} -Properties DispalyName | FT -Properties DisplayName
    

    【讨论】:

    • 我需要是通配符,所以如果人输入 smit 我想要它返回所有 smiths IE:ssmith、rsmith、smithie 等。
    • 也不起作用。我从那里开始。这对 "" + $x + "" 都不起作用。我还尝试在传递到 cmdlet 之前附加 $variable。不知道这笔交易是什么。
    • 嗯.. 我现在可以测试它,但尝试像这样声明$x $global:x = Read-Host
    • 这个效果最好,比我发布的解决方案快 2 倍或 3 倍。谢谢!
    【解决方案2】:

    我同意上述海报。单引号防止变量扩展。 双引号会起作用。

    PS H:\> $s = "smith"
    PS H:\> Write-Host '*$s*' 
    *$s*
    PS H:\> Write-Host "*$s*" 
    *smith*
    

    在某些情况下,双引号无法拯救您,例如有一个对象。

    PS H:\> $psObj = New-Object PsCustomObject
    PS H:\> $psobj | Add-Member -MemberType noteproperty -name s -value "smith"
    PS H:\> Write-Host $psobj.s
    smith
    PS H:\> Write-Host "*$psobj.s*"
    *@{s=smith}.s*
    

    在这种情况下,使用字符串格式:

    PS H:\> Write-Host ("*{0}*" -f $psobj.s)
    *smith*
    

    【讨论】:

    • 你的最后一个例子可以解决:write-host "*$($psobj.s)*"
    • 我理解你的意思,但它似乎没有回答我的问题。因为如果我这样做PS C:\Windows\system32> $x = Read-Host "Enter Name" Enter Name: smith PS C:\Windows\system32> Write-Host "*$x*" *smith* 它应该可以在仅写入主机时将其传递给 Get-ADUser Get-ADUser -Filter { (SAMAccountName -like "*$x*") },它会出现 smith 所以我不明白为什么它不起作用过滤器。感谢对象和变量扩展的说明,非常有帮助。
    • 抱歉格式化,不知道如何在评论部分进行换行。史密斯周围应该有“*”,而不是斜体。
    【解决方案3】:

    嗯,这行得通,只是有点慢:

    $x = Read-Host "Enter Name"
    
    Get-ADUser -Filter * -Properties SAMAccountName | ? { $_.SAMAccountName -like "*$x*" } | Format-Table -Property SAMAccountName
    

    略有不同的方法,但工作不少!谢谢大家的帮助。

    【讨论】:

      【解决方案4】:

      $x 没有在过滤器脚本块内展开,这应该可以完成工作:

      $x = 'mini'
      Get-ADUser -Filter "SamAccountName -like '*$x*'" -Properties DisplayName | ft DisplayName 
      
      DisplayName
      -----------
      Administrator
      

      或者,您可以使用 ldap 过滤器:

      Get-ADUser -LDAPFilter "(samaccountname=*$x*)"
      

      【讨论】:

      • 这也有效。使“Read-Host”代码更简洁。
      • 我怀疑 -Filter {} 被评估为脚本块。因为在我的回答中,变量被正确评估。
      • 它没有在我的系统上进行评估。我记得提交了一个错误,或者只是在内部向 MSFT 报告了这个问题,但我现在找不到。
      【解决方案5】:

      我在使用对象时在我的 powershell 学习曲线中遇到了这个问题。

      我读入了一个用户 id 的 csv 文件,需要对它们进行搜索/匹配/过滤,并且前面放的双引号在那里不起作用。

      我的解决方案是在我的对象上使用 ToString() 方法并将其设置为标量变量,然后在过滤器中使用该变量。效果很好。

      $user_records=Import-CSV .\20140430.userids.csv
      

      该表包含三列“姓名、ID、部门”。 为了让他们进入他们的用户 ID 的搜索过滤器,我使用了:

      foreach ( $thisrow in $user_records ) {
      $thisuser=$thisrow.Username.ToString()
      Get-ADUser -Filter {SamAccountName -eq $thisuser} -SearchBase "OU=Domain Users,DC=topofthecharts,DC=com" -Properties Department 
      

      }

      这完全避免了我的扩展和引用的麻烦。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多