遍历键表中的所有项组合

时间:2018-09-28 14:48:38

标签: powershell

我希望基于预先抓取的数据使用不同的查询字符串来运行网络查询。

我能够很容易地将数据转换成密钥表格式:

$ParamKeyTable = @{
    "Param1" = @(1, 8, 16)
    "Param2" = @(2, 5, 7 )
}

然后,我想遍历成员的所有组合,以便可以对Web服务运行“所有可能的”查询。

一个例子是使用类似的东西:

foreach ($Param1 in $ParamKeyTable['Param1']){
    foreach ($Param2 in $ParamKeyTable['Param2']){
        "Param1 = $('{0:00}' -f $Param1) ; Param2 = $('{0:00}' -f $Param2)"
        $UseInUrl = @{
            "Param1" = $Param1
            "Param2" = $Param2
        }
    }
}

但是参数的数量及其名称可能会不时更改,我只需要在末尾使用$UseInUrl对象,因此获取排列并将其转换为$UseInUrl将为我工作。

我尝试过使用for循环和计算出的最终排列数目,然后使用取模来确定从哪个键使用哪个值,但是根本无法使它起作用,我还尝试过用单独的计数器遍历键,但是还没有找到一种使它像我想要的那样可扩展的方法。

我得到的最接近的东西是这样的,但是我还没有找到一种合理的方法来处理仅递增第一个计数器键的情况。

$ParamKeyTable = [ordered]@{
    "Param1" = @(1, 8, 16)
    "Param2" = @(2, 5, 7 )
}

$Counter = [ordered]@{}
foreach ($Key in $ParamKeyTable.Keys){
    $Counter[$Key] = 0
}

do {
    $UseInUrl = @(foreach ($Key in $ParamKeyTable.Keys){
        if ($Counter[$Key] -le $ParamKeyTable[$Key].Count){
            $Counter[$Key]++
        }

        #logic that actually makes this work goes here

        [PSCustomObject]@{
            $Key = $ParamKeyTable[$Key][$Counter[$Key]]
        }
    })
} while ($UseInUrl -ne $null)

任何帮助或建议,将不胜感激。

1 个答案:

答案 0 :(得分:0)

这个脚本仍然让您不清楚:

## Q:\Test\2018\09\28\SO_52557811.ps1

$ParamKeyTable = @{
     "Param1" = @(1, 8, 16)
     "Param2" = @(2, 5, 7 )
 }

$UseInUrl = foreach ($Param1 in $ParamKeyTable['Param1']){
    foreach ($Param2 in $ParamKeyTable['Param2']){
         [PSCustomObject]@{
            "Param1" = $Param1
            "Param2" = $Param2
        }
    }
}
$UseInUrl

在所有迭代中都将具有以下输出:

> Q:\Test\2018\09\28\SO_52557811.ps1

Param1 Param2
------ ------
     1      2
     1      5
     1      7
     8      2
     8      5
     8      7
    16      2
    16      5
    16      7