当我运行以下代码时,我得到以下结果。
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:\>
为什么在尝试传递变量时是否显示结果?
答案 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表达式语言语法。