我没有透露细节,而是为数据中心工作
我们有传感器数据"在我们的数据库中,从不同的角度来看,这些传感器中的一些不是物理传感器,而是使用专有表达式语言计算各种值的表达式。
本质上我的代码是读取字符串,通过正则表达式提取相关信息,然后查询数据库以查找这些数据,并且在很多情况下返回也是一个表达式,所以我的目标是阅读每个表达式递归,我向返回对象添加一些维度数据,这允许我构建类似于以下的分层树:
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,很容易迷失。
答案 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