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

时间:2017-07-18 18:42:51

标签: powershell properties split

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

$string = "property1.property2.property3"

我有一个对象,我们会调用$object。如果我尝试$object.$string,它不会解释我想要property3 property2 property1 $object的{​​{1}},它认为我想$object."property1.property2.property3" }}

显然,使用split('.')是我需要查看的地方,但如果我拥有未知数量的属性,我不知道该怎么做。我不能静静地做:

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

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

2 个答案:

答案 0 :(得分:3)

一种简单的骗子方法是使用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

有一些显而易见的地方可以加强这些功能并更好地记录,但这应该让你知道你可以做些什么。

答案 1 :(得分:0)

这里的用例是什么?您可以按照自己的描述拆分字符串。这将创建一个数组,您可以计算数组中元素的数量,以便知道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]
}