Powershell:将以句点分隔的字符串转换为对象属性

Powershell:将以句点分隔的字符串转换为对象属性,powershell,properties,split,Powershell,Properties,Split,我有一个字符串,看起来像这样: $string = "property1.property2.property3" 我有一个对象,我们将调用$object。如果我尝试做$object.$string它不会解释我想要属性2的属性1的$object的属性3的属性,它认为我想要$object的$property2.property3的 显然,使用split('.')是我需要寻找的地方,但是如果我有未知数量的属性,我不知道如何做。我不能静态地做: $split = $string.split('.')

我有一个字符串,看起来像这样:

$string = "property1.property2.property3"
我有一个对象,我们将调用
$object
。如果我尝试做
$object.$string
它不会解释我想要
属性2的
属性1的
$object的
属性3的
属性,它认为我想要
$object的
$property2.property3的

显然,使用
split('.')
是我需要寻找的地方,但是如果我有未知数量的属性,我不知道如何做。我不能静态地做:

$split = $string.split('.')
$object.$split[0].$split[1].$split[2]

这不起作用,因为我不知道字符串中有多少属性。那么,如何将字符串中的
n
属性量缝合在一起呢?

这里的用例是什么?您可以按照所述拆分字符串。这将创建一个数组,您可以计算数组中的元素数,以便知道
n

$string = "property1.property2.property3"
$split = $string.split('.')
foreach($i in 0..($split.Count -1)){
    Write-Host "Element $i is equal to $($split[$i])"
    $myString += $split[$i]
}

一种简单的作弊方法是使用
Invoke Expression
。它将构建字符串并以与您自己键入字符串相同的方式执行它

$string = "property1.property2.property3"
Invoke-Expression "`$object.$string"
您需要转义第一个
$
,因为我们不希望它与
$string
同时展开。典型警告:使用
Invoke Expression
时要小心恶意代码的执行,因为它可以执行任何您想要的操作

为了避免这种情况,您必须构建一个递归函数,该函数将获取对象中的当前位置并将其传递给下一个面包屑

Function Get-NestedObject{
    param(
        # The object we are going to return a propery from
        $object,
        # The property we are going to return            
        $property,
        # The root object we are starting from.
        $rootObject
    )
    # If the object passed is null then it means we are on the first pass so 
    # return the $property of the $rootObject. 
    if($object){
        return $object.$property
    } else {
        return $rootObject.$property
    }
}

# The property breadcrumbs
$string = '"Directory Mappings"."SSRS Reports"'
# sp
$delimetedString = $String.Split(".")

$nestedObject = $null

Foreach($breadCrumb in $delimetedString){
    $nestedObject = Get-NestedObject $nestedObject $breadcrumb $settings
}

$nestedObject

有一些明显的地方可以更好地强化和记录该功能,但这应该会让您了解您可以做些什么

如果我拆分字符串,如何在其上循环,以便将其缝合到所需的属性上,如果长度为
n
length?@user3066571在用户案例中仍然不清楚-您所说的“将其缝合到属性上”是什么意思?我对答案进行了扩展,以展示如何将所有部分连接到一个变量
$myString
。。。。基本上,您可以对
foreach
循环中的部分执行您想要的操作。@gms0ulman OP尚未发表评论,但我想我知道他想要什么。看看我的答案,看看你是否认为这可能是他们的目的。@Matt Aaa我明白了!我认为您使用调用表达式“`$object.$string”一针见血;我发现其他代码令人困惑,我认为OP也会。如果OP没有对流程的端到端控制,那么在安全性方面说得很好。是的。我不喜欢另一种方法,但从某种意义上说它更安全。请看这篇文章: