Arrays 在powershell中通过多个数组搜索名称

Arrays 在powershell中通过多个数组搜索名称,arrays,powershell,search,foreach,Arrays,Powershell,Search,Foreach,因此,我有几个数组,其中包含我想要搜索的名称,我希望将这些数组分开,因为它们每个都特定于某一组名称。我正试图找出如何同时搜索多个。下面的代码是如何搜索一个数组,但我不确定搜索多个数组的最佳方法。我试图将-和$array2添加到foreach中,但没有成功 我知道我可以为每个数组添加相同的块,但我想知道是否有更干净、更有效的方法来做到这一点 $array1 = "name1", "name2", "name3" $array2 = "name4", "name5", "name6" $search

因此,我有几个数组,其中包含我想要搜索的名称,我希望将这些数组分开,因为它们每个都特定于某一组名称。我正试图找出如何同时搜索多个。下面的代码是如何搜索一个数组,但我不确定搜索多个数组的最佳方法。我试图将
-和$array2
添加到foreach中,但没有成功

我知道我可以为每个数组添加相同的块,但我想知道是否有更干净、更有效的方法来做到这一点

$array1 = "name1", "name2", "name3"
$array2 = "name4", "name5", "name6"
$searchname = Read-Host "Enter the name to search for"
foreach($name in $array1){
   if($searchname -eq $name){
       Write-Host "$searchname found"
   }
}

如果要跨多个数组中的项目进行搜索,可以在
foreach
语句中连接数组,如下所示:

foreach($name in @($array1;$array2)){
   if($searchname -eq $name){
       Write-Host "$searchname found"
   }
}
更具PowerShell风格的方法需要将管道与
Where-Object
filter cmdlet一起使用:

@($array1;$array2) |Where-Object {$_ -eq $searchname}

如果要跨多个数组中的项目进行搜索,可以在
foreach
语句中连接数组,如下所示:

foreach($name in @($array1;$array2)){
   if($searchname -eq $name){
       Write-Host "$searchname found"
   }
}
更具PowerShell风格的方法需要将管道与
Where-Object
filter cmdlet一起使用:

@($array1;$array2) |Where-Object {$_ -eq $searchname}

如果您只需要验证名称是否存在于任何数组中,您只需将它们连接起来,然后检查结果是否包含您要查找的名称:

if (($array1 + $array2) -contains $name) {
    Write-Host "$name found"
}
如果要标识找到它的阵列,可以执行以下操作:

'array1', 'array2' | ForEach-Object {
    if ((Get-Variable $_).Value -contains $name) {
        Write-Host "$name found in `$$_"
        break
    }
}
或者像这样,如果数组存储在哈希表中而不是单个变量中:

$hash = @{
    array1 = "name1", "name2", "name3"
    array2 = "name4", "name5", "name6"
}

$hash.GetEnumerator() | ForEach-Object {
    if ($_.Value -contains $name) {
        Write-Host ('{0} found in ${1}' -f $name, $_.Name)
        break
    }
}

如果您只需要验证名称是否存在于任何数组中,您只需将它们连接起来,然后检查结果是否包含您要查找的名称:

if (($array1 + $array2) -contains $name) {
    Write-Host "$name found"
}
如果要标识找到它的阵列,可以执行以下操作:

'array1', 'array2' | ForEach-Object {
    if ((Get-Variable $_).Value -contains $name) {
        Write-Host "$name found in `$$_"
        break
    }
}
或者像这样,如果数组存储在哈希表中而不是单个变量中:

$hash = @{
    array1 = "name1", "name2", "name3"
    array2 = "name4", "name5", "name6"
}

$hash.GetEnumerator() | ForEach-Object {
    if ($_.Value -contains $name) {
        Write-Host ('{0} found in ${1}' -f $name, $_.Name)
        break
    }
}
  • 使用PS3+
    -in
    运算符:
    $value-in$array

    或者PS2+
    -contains
    运算符:
    $array-contains$value
  • 在大数组的情况下,不要连接它们,因为这样会很慢
  • 将数组组织成一个数组,以便更容易地枚举它们

    $arrays = @(
        @("name1", "name2", "name3")
        @("name4", "name5", "name6")
    )
    
    $searchname = Read-Host "Enter the name to search for"
    1..$arrays.count | ForEach {
       if ($searchname -in $arrays[$_-1]) {
           Write-Host "$searchname found in array #$_"
       }
    }
    
  • 或者使用哈希表:

    $arrays = @{
        foo = "name1", "name2", "name3"
        bar = "name4", "name5", "name6"
    }
    
    $searchname = Read-Host "Enter the name to search for"
    ForEach ($entry in $arrays.GetEnumerator()) {
       if ($searchname -in $entry.value) {
           Write-Host "$searchname found in array $($entry.key)"
       }
    }
    
  • 使用PS3+
    -in
    运算符:
    $value-in$array

    或者PS2+
    -contains
    运算符:
    $array-contains$value
  • 在大数组的情况下,不要连接它们,因为这样会很慢
  • 将数组组织成一个数组,以便更容易地枚举它们

    $arrays = @(
        @("name1", "name2", "name3")
        @("name4", "name5", "name6")
    )
    
    $searchname = Read-Host "Enter the name to search for"
    1..$arrays.count | ForEach {
       if ($searchname -in $arrays[$_-1]) {
           Write-Host "$searchname found in array #$_"
       }
    }
    
  • 或者使用哈希表:

    $arrays = @{
        foo = "name1", "name2", "name3"
        bar = "name4", "name5", "name6"
    }
    
    $searchname = Read-Host "Enter the name to search for"
    ForEach ($entry in $arrays.GetEnumerator()) {
       if ($searchname -in $entry.value) {
           Write-Host "$searchname found in array $($entry.key)"
       }
    }
    

  • 你的问题有点不清楚。是否希望能够将成员身份赋予特定数组?或者您只是想知道任何数组中是否存在一个名称?只需知道该名称是否存在。例如,我会搜索“name64”,但找不到,很酷。我会搜索“name3”,它返回“name3 found”。我可以为一个数组获得它,只是不确定是否有更好的方法来搜索多个数组,而不必为每个不同的数组反复执行相同的foreach\if语句。您的问题有点不清楚。是否希望能够将成员身份赋予特定数组?或者您只是想知道任何数组中是否存在一个名称?只需知道该名称是否存在。例如,我会搜索“name64”,但找不到,很酷。我会搜索“name3”,它返回“name3 found”。我可以为一个数组获得它,只是不确定是否有更好的方法来搜索多个数组,而不必为每个不同的数组反复执行相同的foreach\if语句。目前还不清楚OP在搜索结果方面寻找的是什么。你认为他不想知道它来自哪个阵列吗?。。。他回答得很好,谢谢!这就是我要找的!只是好奇,但是通过这样做,你怎么能把它缩小到找到名字的数组中?@马特:是的,还不清楚,我只是假设他在寻找一个布尔答案。目前还不清楚OP在寻找什么结果。你认为他不想知道它来自哪个阵列吗?。。。他回答得很好,谢谢!这就是我要找的!只是好奇,但这样做,你怎么能把它缩小到找到名字的数组中?@马特:是的,还不清楚,我只是假设他在寻找一个布尔答案谢谢,太完美了!!谢谢,太好了!!