在Powershell中使用通配符查找数组中键和值的索引

时间:2016-07-07 16:17:15

标签: powershell

我一直在研究一个问题,我能够以相对体面和可接受的方式完成我需要做的事情,但我很好奇为什么我遇到了一些我遇到的问题。

我对PowerShell或C#不太了解,但我对Java,C ++和其他一些人有一些经验。所以,如果我忽略了一些非常简单的事情,你就必须原谅我。我不是在寻找对我的解决方案的批评,只是对我遇到的一些封锁有所了解。

我需要做的是使用Powershell查询LDAP设置。我需要知道MaxConnIdleTime,我需要分配给变量或通过子程序[sic](ex $ ldapPolicies.MaxConnIdleTime)访问,以便我可以通过条件语句运行它。

以下是我如何完成它:

$ldap = Get-ADObject -SearchBase "CN=Query-Policies,CN=Directory Service,CN=Windows NT,CN=Services,CN=Configuration,DC=$ENV:COMPUTERNAME,DC=$dc" -Filter 'ObjectClass -like "queryPolicy"' -Properties ldapadminlimits

$ldap = @($ldap.ldapadminlimits)

$ldap | %{
    if($_.startswith("MaxConnIdleTime")) {
        $match = $_
        }
    }

我尝试过NTDSUtil.exe,但是,我无法重定向"显示值"到一个文本文件,以便稍后阅读,我无法将其写入PowerShell中的变量。

我尝试了Start-Transcript,然后运行了NTDSUtil,但它只记录了PowerShell中发生的事情,而不是NTDSUtil中发生的事情。

此外,我尝试将所有命令一次性提供给NTDSUtil(NTDSUtil" ldap policies"" connections""连接到服务器$ ENV:COMPUTERNAME" q "显示值")但PowerShell在控制台中没有显示任何内容,我按下退出序列返回PS&gt ;.

我知道我可以使用LDP,但我对ADSI不太熟悉。研究似乎表示,尝试获得LDPdump有点过时,我几乎放弃了这种尝试。

我遇到的一个问题让我有点沮丧(我问这个问题的原因)是为什么我不能搜索数组并使用通配符找到项目的索引?我试过这样做:

$ldap.IndexOf("MaxConnIdleTime*")

$ldap.IndexOf($ldap -like "MaxConnIdleTime*")

但它总是返回-1。

如果我尝试,它会正常工作:

$ldap.IndexOf("MaxConnIdleTime=100")

鉴于该值确实为100.但我确认该值是正确的。

我知道我可以做这样的事情:

if($ldap -contains "MaxConnIdleTime=100") {
    DO SOMETHING...
    } else {
        DO SOMETHING ELSE...
        }

为什么我无法使用通配符运算符搜索数组?没有歧义,所以,它应该有效,对吗?

我不是在寻找对我如何实现这一目标的批评,我只是想了解它为什么会这样做。

感谢。

1 个答案:

答案 0 :(得分:0)

我不认为在PowerShell中有一个简单的“通过通配符搜索数组并返回索引”cmdlet,方法,语句等。

.IndexOf不适用于通配符。

当您在数组上使用-like运算符时,您可能只找到一个匹配对象,但-like在数组上使用时会返回匹配数组。

将数组传递给.IndexOf()然后查找一个本身就是数组的数组元素,即使该数组只有一个对象。

这样可行:

$ldap.IndexOf(($ldap -like "MaxConnIdleTime*")[0])

只要你一直想找到第一个。