我是一个专业的Linux系统pipe理员,但我不得不做一些权力。 我的问题是这样的:
我用这个命令从AD得到活动用户列表:
$allusers= get-aduser -Filter {Enabled -eq $true} | FT samAccountName
我的意图是$ alluserrs成为一个数组填充get-aduser命令的输出行。 在数组填充后popup这个块似乎证实确实如此。
for ($i; $i -le $allusers.length; $i++) { $allusers[$i] }
大! 所以现在我想检查一个给定的用户名是否存在于该数组中。 我看到数组中包含一个非常方便的“Contains()”函数,看起来它应该是我的目的。
echo $allusers.Contains("joeq")
可惜! 我得到这个错误:
Method invocation failed because [System.Object[]] doesn't contain a method named 'contains'.
在C:\ Users \ dylanh \ jirauserpurge.ps1:33 char:24 + echo $ allusers.contains <<<<(“joeq”)+ CategoryInfo:InvalidOperation:(contains:String)[],RuntimeException + FullyQualifiedErrorId:MethodNotFound
嗯…好吧,让我们去“老skool”
for ($i; $i -le $allusers.length; $i++) { if ($allusers[$i] -eq "joeq") { echo "joeq present" } }
条件从来没有匹配! 我的脑袋疼! 好吧,可能有一些空白字符在这里造成恶作剧,让修剪:
for ($i; $i -le $allusers.length; $i++) { if ($allusers[$i].Trim() -eq "joeq") { echo "joeq present" } }
但是不,结果是:
Method invocation failed because [Microsoft.PowerShell.Commands.Internal.Format.FormatEntryData] doesn't contain a method named 'Trim'. At C:\Users\dylanh\jirauserpurge.ps1:39 char:24 + if ($allusers[$i].Trim <<<< () -eq "nickf") { + CategoryInfo : InvalidOperation: (Trim:String) [], RuntimeException + FullyQualifiedErrorId : MethodNotFound
显然,它是某种types的铸造问题,我错过了。 我需要做些什么来允许在“数组”中search特定的值?
更新:在fdibot的答案和HopelessN00b的评论的帮助下,我有一个工作解决scheme:
$allusers= get-aduser -Filter {Enabled -eq $true} $usernames = @() for ($i=0; $i -le $allusers.length; $i++) { $usernames += $allusers[$i].SamAccountName } $usernames -contains "joeq"
额外的循环似乎有点多余的TBH(或至less会在bash!)啊! 感谢大家的意见。
问题出现在你的格式表:)
$allusers= get-aduser -Filter {Enabled -eq $true} | FT samAccountName $allusers | gm
TypeName:Microsoft.PowerShell.Commands.Internal.Format.FormatStartData
名称MemberType定义—- ———- ———- Equals方法bool Equals(System.Object obj)GetHashCode
方法int GetHashCode()GetType
方法typesGetType()ToString
方法stringToString()autosizeInfo
属性Microsoft.PowerShell.Commands.Internal.Format.AutosizeInfo,Syste … ClassId2e4f51ef21dd47e99d3c952918aff9cd属性string ClassId2e4f51ef21dd47e99d3c952918aff9cd {get;} groupingEntry
属性
Microsoft.PowerShell.Commands.Internal.Format.GroupingEntry,Syst … pageFooterEntry属性
Microsoft.PowerShell.Commands.Internal.Format.PageFooterEntry,Sy … pageHeaderEntry属性
Microsoft.PowerShell.Commands.Internal.Format.PageHeaderEntry,Sy … shapeInfo属性
Microsoft.PowerShell.Commands.Internal.Format.ShapeInfo,System.M …
这不是你想要search的用户名。
如果你这样做
$allusers= get-aduser -Filter {Enabled -eq $true} $allusers | gm
您将获得一个包含您所有属性的对象集合。 在这里你可以检查一下,如果这样的话
$allusers.SamAccountName -eq "joeq"
现在你可以继续你的脚本,并循环所有的用户列表,试试这个:
get-aduser -Filter {Enabled -eq $true} | Foreach { if ($_.SamAccountName -eq "something") { "OK" } }
你可以使用“select -expand xxx”来生成一个扁平的(?)数组,在这里你不需要使用属性名来parsing数组。
$allusers = get-aduser -Filter {Enabled -eq $true} | select -expand samAccountName PS C:\> $allusers.contains("GeoSword") True
如果你不需要$allusers使用$allusers作为用户对象的集合(或者如果你需要的只是用户的名字),那么你可以通过这样做来减less你在shell的内存中存储的内容:
$usernames = (get-aduser -Filter {Enabled -eq $true}).samAccountName $usernames.Contains("check_value")
或者说你有一个检查值的整个数组,你要循环通过名为$check_array ,你想检查每个用户名,看看他们是否在该数组:
$usernames = (get-aduser -Filter {Enabled -eq $true}).samAccountName foreach ($i in $check_array) { $usernames.Contains($i) }
虽然,根据两个arrays的相对长度,第二个可能会更好:
foreach ($j in (get-aduser -Filter {Enabled -eq $true}).samAccountName) { $check_array.Contains($j) }
最后,如果您不需要在此步骤之后重用用户名列表,并且只需要检查一个检查值:
((get-aduser -Filter {Enabled -eq $true}).samAccountName).Contains("check_value")
将返回该检查的布尔结果。
然而,如果你正在编写一个脚本或函数,而另一个方法不是最好的实践,那么在你不在的时候,别人可能需要拆开这个脚本或函数来进行修复或重新devise。 如果只是为了你,所有你需要的是一个布尔结果,但是,我会去那个,它应该运行大约相同的时间,你将不会坚持(可能)巨大的数组的用户名(或者甚至更大的对象数组和用户名数组)。但是,再一次,如果你正在重用这个用户对象数组,你的方式应该没问题。
用($i=0; $i ...来计算数组可能会变得更加整齐–PowerShell用foreach很好地遍历事物,但是通常你也不需要这样做。
$allusers= get-aduser -Filter {Enabled -eq $true} $usernames = @() for ($i=0; $i -le $allusers.length; $i++) { $usernames += $allusers[$i].SamAccountName } $usernames -contains "joeq"
可能:
$usernames = Get-ADUser -Filter {Enabled -eq $true} | select -Expand sAmAccountName $usernames -contains "joeq"
在selectselect要保留的属性或属性的情况下,expand参数将这一个属性平滑为一个普通的string,而不是将其保留为名称/值对。
[这与Craig620的答案相同,但是我正在回答计数for-loop,所以答案的path是不同的]。