【问题标题】:Computer Description Query计算机描述查询
【发布时间】:2018-11-16 00:45:32
【问题描述】:

好吧,我被语法困住了。数字。如果有人可以用另一双好眼睛帮助我,我将不胜感激。下面是我的脚本,下面是返回我正在寻找的值的一个衬垫。该脚本没有返回任何内容。

脚本

$BBUIDS = Get-Content 'C:\working\ad\Userstest.txt'

ForEach ($Name in $BBUIDS)
{
Get-ADComputer -Filter 'Description -like $("$Name")' -Properties *  -SearchBase "OU=Win10,OU=Laptops,OU=Computers,OU=MYDOMAIN" | Select-Object CN
}

单线工作

Get-ADComputer -Filter 'Description -like "USERNAMEHERE"' -Properties * -SearchBase "OU=Win10,OU=Laptops,OU=Computers,OU=MYDOMAIN" | Select-Object CN

【问题讨论】:

    标签: powershell active-directory


    【解决方案1】:

    仅当您使用双引号时,PowerShell 才会在引号内展开变量。这在有关quoting rules 的文档中有所描述:

    当您将字符串用双引号(双引号字符串)括起来时,以美元符号 ($) 开头的变量名将替换为变量的值

    您可以在 PowerShell 提示符下对此进行测试:

    $Name = "username"
    'This is wrong: $Name'
    "This is right: $Name"
    

    输出将是:

    This is wrong: $Name
    This is right: username
    

    您会注意到,PowerShell 甚至会在使用双引号时突出显示 $Name,但在使用单引号时不会。

    所以在你的情况下,你需要这样的东西:

    Get-ADComputer -Filter "Description -like '$Name'" -Properties *  -SearchBase "OU=Win10,OU=Laptops,OU=Computers,OU=MYDOMAIN" | Select-Object C
    

    双引号里面的单引号是可以的。你只需要外引号是双引号。

    或者,

    Get-ADComputer -Filter {Description -like "$Name"} -Properties * -SearchBase "OU=Win10,OU=Laptops,OU=Computers,MYDOMAIN" | Select-Object CN
    

    另外,我注意到您使用的是 -like,但您没有使用任何通配符 (*)。那么Description 完全 与用户名匹配吗?如果是这样,您可以通过使用-eq 而不是-like 获得更好的性能。

    如果不完全匹配,那么您应该使用"*$Name*"

    【讨论】:

    • Description 字段是否与用户名完全匹配(没有多余的字符)?
    【解决方案2】:

    变化:

    Get-ADComputer -Filter 'Description -like $("$Name")' ...
    

    到:

    $Name = "*$Name*"
    Get-ADComputer -Filter {Description -like $Name} ...
    

    基于 cmets 编辑

    $BBUIDS = Get-Content 'C:\working\ad\Userstest.txt'
    ForEach ($Name in $BBUIDS) { 
    
        $Name = "*$Name*" 
        Get-ADComputer -Filter {Description -like $Name} -Properties * -SearchBase "OU=Win10,OU=Laptops,OU=Computers,MYDOMAIN" | Select-Object CN 
    } 
    

    【讨论】:

    • 试过了,它什么也没返回,但不会出错。它应该返回 3 个值。
    • 更新了我的答案。
    • 刚刚试了一下,得到了下面的错误。 Get-ADComputer : 无法识别搜索过滤器
    • 您是否也在代码中添加了$Name = "*$Name*"
    • 是的,就在 BBUID 线的下方。
    【解决方案3】:

    你可以使用其中任何一个,虽然第一个更有效

    Get-ADComputer -Filter {Description -like "*$Name*"} -Properties *  -SearchBase "OU=Win10,OU=Laptops,OU=Computers,OU=MYDOMAIN" | Select-Object CN
    

    Get-ADComputer -Filter * -Properties *  -SearchBase "OU=Win10,OU=Laptops,OU=Computers,OU=MYDOMAIN" |where-object {$_.Description -like "*$Name*"} | Select-Object CN
    

    【讨论】:

    • 试过了,它爆炸了。它应该返回带有用户名的计算机描述中的值。如果它是作为单个衬里完成的,则每次工作时手动编辑名称。当您尝试使用带有用户名的文本文件在脚本中执行此操作时。它要么爆炸,要么不返回任何值。我确信这只是一个我还没有考虑过的语法问题。
    • 'Description -like $("$Name")' 这部分在您的代码中不正确。如果它适用于单个输入,请确保您提供正确的输入。尝试,每次都打印 $ Name 的输出。有时它可能包含带有名称的额外空格,您可以尝试使用 trim 功能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多