不在通配符搜索上显示输出

时间:2016-10-05 09:33:57

标签: powershell

当我运行以下代码时,我得到以下结果。

import-module activedirectory
Get-ADComputer -Filter {Name -Like "*1234*"} -Property * | Format-Table Name,OperatingSystem,OperatingSystemServicePack -Wrap -Auto

Name       OperatingSystem      OperatingSystemServicePack
----       ---------------      --------------------------
DEP12345LT                                                
CLC41234DT Windows 7 Enterprise Service Pack 1            
A123456    Windows 7 Enterprise Service Pack 1       

但是当我运行这段代码时

import-module activedirectory
$assetid = Read-Host "Assest id"
Get-ADComputer -Filter {Name -Like "*$assetid*"} -Property * | Format-Table Name,OperatingSystem,OperatingSystemServicePack -Wrap -Auto

我得到了

PS U:\> V:\General Helpful Scripts and Code\wild_card_pc_number_finder.ps1
Assest id: 1234

PS U:\>

为什么在尝试传递变量时是否显示结果?

1 个答案:

答案 0 :(得分:1)

看起来-Filter参数未正确评估字符串"*$assetid*"。如果首先在另一个变量中创建字符串然后使用它,它将起作用。

Import-Module activedirectory
$assetid = Read-Host "Assest id"
$like = "*$assetid*"
Get-ADComputer -Filter {Name -Like $like} -Property * | Format-Table Name,OperatingSystem,OperatingSystemServicePack -Wrap -Auto

另一种方法是使用PowerShell Expression Language Syntax-Filter参数创建一个字符串(more info)。

-Filter "Name -like '*$assetid*'"

我能够理解为什么这不起作用的原因是PowerShell试图将{Name -Like "*$assetid*"}转换为PowerShell Expression Language Syntax,这基本上是一个字符串,所以你将结束转换之后你会有这样的事情。

'Name -Like "*$assetid*"'

意味着您正在搜索*$assetid*而不是变量的值。

这就是为什么你可以使用我提供的第二个例子。由于PowerShell将在将字符串传递给参数之前对其进行评估。您使用的方法将传递{ .. }脚本块,然后cmdlet将尝试将其转换为PS表达式语言语法。