PowerShell:在嵌套函数中传递唯一变量

时间:2015-09-28 19:10:05

标签: powershell nested-loops

我没有透露细节,而是为数据中心工作

我们有传感器数据"在我们的数据库中,从不同的角度来看,这些传感器中的一些不是物理传感器,而是使用专有表达式语言计算各种值的表达式。

本质上我的代码是读取字符串,通过正则表达式提取相关信息,然后查询数据库以查找这些数据,并且在很多情况下返回也是一个表达式,所以我的目标是阅读每个表达式递归,我向返回对象添加一些维度数据,这允许我构建类似于以下的分层树:

Top ([Point1];[Point2])
    1 ([child of Point1])
        2 ([child of Point1 #1])
    1 ([child of Point2])
        2 ([child of Point1 #1])
        2 ([child of Point1 #2])

因为代码有点混乱,它的IF嵌套在IF中,嵌套在IF' s中 理想情况下,我希望能够制作嵌套的一次性功能,这样我就可以设置一些参数,例如

Function RecursiveFunction{
    [CmdletBinding()]
    param
    (
     [Parameter(ValueFromPipelineByPropertyName=$True)]
     [String]$InputObject,

     [Parameter(ValueFromPipelineByPropertyName=$True)]
     [String]$Tree_Level,

     [Parameter(ValueFromPipelineByPropertyName=$True)]
     [String]$Next_Level
)

BEGIN {}

PROCESS {
        $inputobject+$tree_level = "REGEX expression"

        "More commands and queries"

        $InputObject+$Next_Level = "Result of Commands and Queries"

END{}

}
Export-ModuleMember RecursiveFunction

然后当我调用函数时,我希望能够从前一个树级别引用唯一变量,例如,请记住我的层次结构是:

Top
 1
  2
   3

构造看起来像这样。

$InputData = Import-CSV data.csv

    ForEach($ThingTop in $InputData)
        {
        RecursiveFunction -InputObject $ThingTop -Tree_Level "Top"

        IF($InputObject1 -ne $Null)
            {
            ForEach($Thing1 in $InputObject1)

            RecursiveFunction -InputObject $Thing1 -Tree_Level "1"

            }
        }

这会减少3或4级,如果我能弄清楚如何动态重命名函数中的变量,这将允许我,最有可能只是添加一个数字到最后这将允许我做一些更实用的功能,并避免一些意大利面条代码,因为现在它有大约300行IF,很容易迷失。

1 个答案:

答案 0 :(得分:0)

我认为你过度复杂化了。但是,我知道递归有时会让人感到困惑。你需要的是以递归方式调用自身内部的函数。实质上,您使用父路径调用函数。然后,在函数内部,您有一个循环,然后枚举所有子路径""那条父路径。然后,在循环中,再次调用函数本身。我不了解你的情况,但这是一个例子。

您最终会为每条路径调用该功能。如果你不小心,有时它会无限期地运行,如果你没有某种条件在那里见面,一旦你想让它停止。

Function Get-SomeMatch
{
    [CmdletBinding()]
    param
    (
        [Parameter()]
        [String[]]$Paths
    )

    ForEach ($i in $Paths)
    {   
        Get-SomeMatch -InputObject $i
    }
}

$InputData = Import-CSV data.csv

Get-SomeMatch -Paths $InputData