我是PowerShell的新手,从Python背景中即时学习它。
我从另一个工具中提取数据,该工具通过REST调用检索数据。
METERS变量以这种格式存储在源代码中。
{
"500 HR": 500,
"1000 HR": 1000,
"2000 HR": 2000
}
PowerShell代码
#REST call to source
$meter=@{}
Foreach ($item in $origresult.Items) {
$result = (Invoke-RestMethod -Uri $url -Headers $headers -Method GET -ContentType application/json -ErrorVariable RespErr)
$meter.Add($item.Name,$result.Value)
}
Write-Host ($meter | Out-String) -ForegroundColor Red
这是输出
Name Value
---- -----
LastUploaded 2020-12-29T06:38:02
IsEnabled 1
METERS {...
ORGID WHS
如何检索METERS并遍历字典?到目前为止,我已经尝试过了。Python用其简单的数据结构宠坏了我,PowerShell并不是那么简单,除非有更简单的方法来做到这一点。
$mymeters = $meter.METERS | ConvertFrom-Json
Write-Host ($mymeters | Out-String) -ForegroundColor Yellow
输出量
500 HR : 500
1000 HR : 1000
2000 HR : 2000
到目前为止,我已经尝试过一些方法-
$mymeters = [ordered]@{}
" Here is the item $mymeters.Get_Item(500 HR)" #my silly attempt!
# Looping is a no go either - it says specialized ordered dictionary
foreach ($ind in $mymeters) {
" --> $ind"
}
输出量
Here is the item System.Collections.Specialized.OrderedDictionary.Get_Item(500 HR)
--> System.Collections.Specialized.OrderedDictionary
我可能缺少一些真正的基本知识,但我无法自己弄清楚!任何帮助都非常感谢。我想要的只是遍历METERS哈希表/字典并调用一个函数。
在深入探讨它之前,让我们回顾一些PowerShell语法基础知识,看看我们是否可以重用您的一些Python直觉:)
就像在Python中一样,您可以使用成员访问运算符按名称引用对象的属性.
-对于非连续名称,请使用引号:
$mymeters = $meter.METERS | ConvertFrom-Json
$mymeters.'500 HR' # evaluates to `500`
PowerShell中的字符串文字有两种截然不同的风格:
'Hello World!'
)
''
(文字单引号)"Hello World!"
)
$variable
标记和$()
将出现的子表达式,除非明确地逃脱了-`
是转义字符,而且你在大多数类似C语言(预计通用序列`n
,`t
,`r
,等)本身的认可。但是,任意表达式(如$dictionary.get_Item('some key')
)不会按原样求值。
为了解决这个问题,我们可以使用-f
字符串格式运算符:
$mymeters = [ordered]@{}
"Here is item '500 HR': {0}" -f $mymeters['500 HR']
-f
如果您曾经使用过Python3的f
字符串,应该会感到很熟悉,但需要注意-PowerShell的-f
运算符是薄包装String.Format()
,并且String.Format()
仅支持基于0的占位符-'{0} {1}' -f 1,2
有效,但'{} {}' -f 1,2
无效。
另一个选择是将表达式包装在$()
双表达式字符串文字内的子表达式运算符中:
$mymeters = [ordered]@{}
"Here is item '500 HR': $($mymeters['500 HR'])"
请注意,PowerShell中的字典支持使用[]
-进行Python的键控索引访问:
与Python一样,PowerShell(通常也包括.NET)也具有强大的自省功能。
动态发现和迭代任何对象的属性就像引用一个名为的特殊成员一样简单psobject
:
foreach($propertyMetadataEntry in $someObject.psobject.Properties){
"Property: {0,-20} = {1}" -f $propertyMetadataEntry.Name,$propertyMetadataEntry.Value
}
或您的情况:
$mymeters = $meter.METERS | ConvertFrom-Json
foreach($meterReading in $mymeters.psobject.Properties){
"Meter: {0,-20} = {1}" -f $meterReading.Name,$meterReading.Value
# do whatever else you please with $meterReading here :)
}
这将适用于任何标量对象(如ConvertFrom-Json
或返回的对象Invoke-RestMethod
)。
要遍历字典中的条目,您需要显式调用.GetEnumerator()
:
$dictionary = [ordered]@{ A = 1; B = 2; C =3 }
foreach($keyValuePair in $dictionary.GetEnumerator()){
"Dictionary Entry: {0} = {1}" -f $keyValuePair.Key,$keyValuePair.Value
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句