【问题标题】:Is it possible to make IndexOf case-insensitive in PowerShell?是否可以在 PowerShell 中使 IndexOf 不区分大小写?
【发布时间】:2018-11-12 15:18:56
【问题描述】:

我在终端服务器中搜索由查询会话命令组成的数组中的索引时遇到问题。

这是有问题的脚本:

# Array of logged users in terminal servers 
$a=Get-RDUsersession -CollectionName "BLABLA" -ConnectionBroker BLABLA.BLA.BL

# Array of all users with two columns from active directory
$b=Get-ADUser -filter * -properties TelephoneNumber,SamAccountName

现在想象一下使用帐户名TEST 而不是test 登录终端服务器。

如果我这样做:

$c = $b[$b.SamAccountName.indexof("test")].TelephoneNumber

那我不知道电话号码。

我认为这是因为区分大小写,不是吗?如果我在搜索命令中输入TEST,我会得到正确的数字。

有没有什么简单的方法可以解决这个问题并使索引的搜索不区分大小写? 我已经阅读了有关使用方法 [StringComparison]"CurrentCultureIgnoreCase" 的信息,但它似乎不适用于数组。

谢谢。

【问题讨论】:

标签: arrays powershell indexof case-sensitive case-insensitive


【解决方案1】:

既然 $b 是一个 Object[] 类型,那么你可能想要做一个 Where-Object。

$b | Where-Object -FilterScript {$_.Samaccountname -like '*Smith*'} | Select-Object -ExpandProperty 'telephoneNumber'

话虽如此,如果将 Powershell 中的数组转换为 [Collections.Generic.List[Object]] 类型,则可以不区分大小写地对其进行索引。

$b = [Collections.Generic.List[Object]]$b
$b.FindIndex( {$args[0].sAMAccountName -eq 'test'} )

请注意,在 AD 中提取每个用户对象并使用 where-object 或索引匹配进行过滤可能会非常慢。您可以根据需要改为 Get-ADUser,也可以使用仅提取 $a 中返回的用户的过滤器提取所有 ADuser。

如果您坚持一键将所有 ADUser 放在一个位置,请考虑在列表中循环一次以进行哈希查找,以便您轻松索引哈希值。

#Create account lookup hash
$accountlookup = @{}
foreach ($element in $accounts) {
  $accountlookup[$element.SamAccountName] = $element 
}

希望有帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-16
    • 1970-01-01
    • 2011-02-05
    相关资源
    最近更新 更多