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没有对流程的端到端控制,那么在安全性方面说得很好。是的。我不喜欢另一种方法,但从某种意义上说它更安全。请看这篇文章: