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