Powershell Get ADUser中带有变量的通配符

Powershell Get ADUser中带有变量的通配符,powershell,Powershell,我确信这只是一个语法错误,但我正在尝试搜索广告用户,我不明白为什么这不起作用: Write-Host "Enter LastName or UserName:" $x = Read-Host Get-ADUser -Filter { SAMAccountName -like '*$x*' } -Properties DispalyName | FT -Properties DisplayName 只是什么都不退。我确信这是带有“*”的语法。但不知道为什么。谢谢您的帮助。尝试更改以下内容: {

我确信这只是一个语法错误,但我正在尝试搜索广告用户,我不明白为什么这不起作用:

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

只是什么都不退。我确信这是带有“*”的语法。但不知道为什么。谢谢您的帮助。

尝试更改以下内容:

{ SAMAccountName -like "*$x*" }
编辑:

这应该是有效的:

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

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

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*

好吧,这很有效,只是有点慢:

$x = Read-Host "Enter Name"

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

虽然方法略有不同,但效果却不尽相同!感谢所有帮助。

$x未在筛选器脚本块中展开,这应该可以完成以下工作:

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

DisplayName
-----------
Administrator
或者,您可以使用ldap筛选器:

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

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

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*
我在csv文件中读取了一个用户id,需要对其进行搜索/匹配/筛选,正如前面提到的那样,双引号在那里不起作用

我的解决方案是对对象使用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 
}


这避免了我的扩展,并完全引用了问题。

我需要一张通配符,因此,如果用户键入smit,我希望它返回所有Smith,即:ssmith、rsmith、smithie等也不起作用。我从那里开始。这在“+$x+”中也不起作用。在传递到cmdlet之前,我还尝试附加$variable。不确定交易是什么。嗯。。我现在可以测试它,但是试着像这样声明
$x
$global:x=Read Host
这是最好的,比我发布的解决方案快2倍或3倍。谢谢你的最后一个例子可以用:
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*”)
,它来自史密斯,所以我不明白为什么它在过滤器中不起作用。感谢对对象和变量展开的说明,这非常有帮助。很抱歉设置了格式,不知道如何在注释部分进行换行。史密斯的周围应该有“*”,而不是斜体。这也行。使“读取主机”代码更干净。我怀疑
-Filter{}
是否作为脚本块计算。。因为在我的回答中,变量的计算是正确的,而不是在我的系统中进行计算。我记得我在这上面提交了一个bug,或者可能只是在内部向MSFT报告了这个问题,但我现在找不到它。