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)
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.我认为有一些问题,如何计数处理单个元素返回结果需要被转换为数组,@()以确保正确的数字.
| 归档时间: |
|
| 查看次数: |
7276 次 |
| 最近记录: |