2017-03-06 88 views
2

我有一个来自AD的哈希表,其中包含用户名和服务帐号。我试图找到所有的服务帐户。所有用户名都以其首字母(如'r')和服务帐户('s')唯一标识。例如:r398831和s882443。下面是该阵列的一个例子,我有:查找以'n'开头的用户名

$null = $usrArr.Add([pscustomobject] @{ 
    sName = $user.name 
    sGivenName = $user.GivenName 
    sSurname = $user.Surname 
    sEnabled = $user.Enabled 
    }) 

$lastSeen = $usrArr | select * | Where {$_.sEnabled -eq $true} 
$lastSeen = $lastSeen | Sort-Object -Unique -Property sName 

我使用-contains和-match尝试,但它似乎并没有给拉了回来,我什么后:

$svcAcc = $lastSeen | where-object {$_.sName -like "s"} 

我是否必须为每个执行一个或我刚刚搞乱我的语法呢? 我在想也许我需要排序对象,但必须有一个更简单的方法来实现如此基本的功能。欣赏关于它的任何建议。

感谢提前:)

最佳, 皮特

回答

7

-like运营商在RHS通配符匹配模式对整个LHS,所以-like "s"永远只能匹配完全是与字面意思s相同。

若要改为匹配文字s开始投入使用通配符模式​​:

$svcAcc = $lastSeen | where-object { $_.sName -like 's*' } 

顺便说一句:您使用的select *似乎是多余的;同样,-eq $true不是绝对必要的,所以分配给$lastSeen可以简化为:

$lastSeen = $usrArr | Where-Object sEnabled | Sort-Object -Unique -Property sName 

注意Where-Object sEnabled是短期的Where-Object { $_.sEnabled },这是一个语法简化introduced in PSv3,称为比较报表

+1

谢谢你的帮助。完美的作品。是的,我正在复制和粘贴一些代码,并忘记取出* – user1894814

3

您可以使用-match,就像您试图做的一样,只是使用插入符号锚点字符将您的查询转换为正则表达式。

$usrArr | Where-Object { $_.sName -match "^s" }