我有一个看起来像这样的字符串:
$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
个属性中将它拼接在一起呢?
答案 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]
}