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

rws*_*907 2 arrays powershell powershell-2.0

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

# The criteria array used for comparison 
$criteria = "sysadmin", "dbadmin", "netadmin"
Run Code Online (Sandbox Code Playgroud)

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

$dynamicarray = "voipadmin", "mailadmin", "sysadmin"
Run Code Online (Sandbox Code Playgroud)

比较是真的.

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

UPDATE

我正在测试的系统工作但是当我将它移动到另一个系统时却没有.唯一的区别是测试系统是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"
}
Run Code Online (Sandbox Code Playgroud)

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

更新2

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

if($(Compare-Object $MMIArray1 $userMemberOf -includeequal -excludedifferent).count -gt 0){
Run Code Online (Sandbox Code Playgroud)

if(@(Compare-Object $MMIArray1 $userMemberOf -includeequal -excludedifferent).count -gt 0){
Run Code Online (Sandbox Code Playgroud)

Mat*_*att 5

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

$criteria = "sysadmin", "dbadmin", "netadmin"
$dynamicarray = "voipadmin", "mailadmin", "sysadmin"
Run Code Online (Sandbox Code Playgroud)

-比赛

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

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

"sysadmin dbadmin netadmin" -match voipadmin|mailadmin|sysadmin
Run Code Online (Sandbox Code Playgroud)

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

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

希望将字符串与其中一个变量"voipadmin","mailadmin"或"sysadmin"匹配.由于它包含"sysadmin",因此该语句为真.

- 包含

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

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