使用PowerShell确定第二个字符串数组中是否存在一个数组中的任何字符串

时间:2015-03-03 00:35:43

标签: arrays powershell powershell-v2.0

我正在使用两个阵列。一旦它包含一组存储为字符串的条件,并且根据我的脚本中先前执行的查找结果动态生成一个条件。我需要做的是确定条件数组中的任何字符串是否存在于动态数组中,以便我可以执行一些条件例程。

# The criteria array used for comparison 
$criteria = "sysadmin", "dbadmin", "netadmin"

从这一点开始我想做的是,如果动态数组包含任何这些值,则继续处理。所以,如果

$dynamicarray = "voipadmin", "mailadmin", "sysadmin"

比较是真的。

我对PowerShell仍然相当新,但到目前为止-contains或.contains或-match似乎不起作用。答案需要与PoSH 2.0一起使用。

更新

我正在测试的系统工作但是当我把它移到另一个系统时却没有。唯一的区别是测试系统是PoSH 3.0,而prod系统是2.0

以下是更多prod脚本,以便您更好地理解

$user = $env:USERNAME
$workstation = $env:COMPUTERNAME

$userMemberOf = ([ADSISEARCHER]"samaccountname=$user").Findone().Properties.memberof -replace '^CN=([^,]+).+$','$1' # User Group Memberships

$MMIArray1 = "Dispatch", "Engineers", "Operators"

# USER GROUP-BASED CUSTOMIZATIONS
if(@(Compare-Object $MMIArray1 $userMemberOf -includeequal -excludedifferent).count -gt 0){
#matches
  Write-Host "true"
}else{
  #no matches
  Write-Host "false"
}

在Prod PoSH 2.0环境中,一切评估为假。

更新2

经过一些修补后,我发现我需要改变

if($(Compare-Object $MMIArray1 $userMemberOf -includeequal -excludedifferent).count -gt 0){

if(@(Compare-Object $MMIArray1 $userMemberOf -includeequal -excludedifferent).count -gt 0){

2 个答案:

答案 0 :(得分:5)

Nathan Rice有一个更简单的答案,但既然你提到-contains-match,我想我可以告诉你几种方法来完成这项工作。给出你的样本字符串

$criteria = "sysadmin", "dbadmin", "netadmin"
$dynamicarray = "voipadmin", "mailadmin", "sysadmin"

<强> - 匹配

If([string]$criteria -match ($dynamicarray -join "|")){
    Write-host "Do something"
}

-Match通常对字符串进行正则表达式比较并返回[boolean]结果。你有数组,我们需要将一个数组作为一个字符串,并与另一个创建一个正则表达式匹配。一种翻译的方式来看看这里发生的事情是

"sysadmin dbadmin netadmin" -match voipadmin|mailadmin|sysadmin

在生产环境中,可能有助于强化正则表达式字符串。由于特殊字符可能潜入阵列,因此如果存在则将它们排除在外是一个好习惯。

If([string]$criteria -match "($(($dynamicarray|ForEach{[RegEx]::Escape($_)}) -join '|'))"{}

希望将字符串与其中一个变量匹配&#34; voipadmin&#34;,&#34; mailadmin&#34;或&#34;系统管理员&#34;。因为它包含&#34; sysadmin&#34;声明是真的。

<强> - 包含

$results = @($dynamicarray | Where-Object{$criteria  -contains $_})
If($results.Count -gt 0){
    "There was at least one match"
}

-Contains可能会误导新用户(请注意它转到我身边)。它正在检查单个元素是否位于数组中。由于您有两个数组,我们需要一次检查每个元素。不是唯一的方法,但上面的内容将允许{{1>}中包含 的元素。同样,$dynamicarray有一个匹配将是1.我认为有一些问题,如何计数处理单个元素返回结果需要被转换为数组.Count以确保正确数。

答案 1 :(得分:1)

如果相等值的计数大于0,则表示匹配:

If ($(Compare-Object $criteria $dynamicarray -includeequal -excludedifferent).count -gt 0) {
  #matches
  Write-Host "true"
} Else {
  #no matches
  Write-Host "false"
}