<p>在深入研究它之前,让我们先回顾一下PowerShell的一些语法基础知识,看看是否可以重复使用您的一些Python直觉:)</p>
<h2>成员访问</h2>
<p>就像在Python中一样,您可以使用<code>.</code>成员访问操作符通过<em>name</em>引用对象的属性-对于非连续名称,请使用引号:</p>
<pre><code>$mymeters = $meter.METERS | ConvertFrom-Json
$mymeters.'500 HR' # evaluates to `500`
</code></pre>
<h2>字符串表达式</h2>
<p>PowerShell中的字符串文字有两种不同的风格:</p>
<ul>
<li>单引号字符串(<code>'Hello World!'</code>)
<ul>
<li>这些是<em>逐字</em>字符串文字,唯一支持的转义序列是<code>''</code>(文字单引号)</li>
</ul>
</li>
<li>双引号字符串(<code>"Hello World!"</code>)
<ul>
<li>这些是<em>可扩展的</em>字符串文本-除非显式转义-<code>`</code>是转义字符,否则将自动插入<code>$variable</code>标记和<code>$()</code>子表达式,并且大多数C类语言中的常见序列(<code>`n</code>、<code>`t</code>、<code>`r</code>等)都是本机识别的</李>
</ul>
</li>
</ul>
<p>但是,任意表达式(如<code>$dictionary.get_Item('some key')</code>)将不会按原样进行计算</p>
<p>为了解决这个问题,我们可以使用<code>-f</code>字符串格式操作符:</p>
<pre><code>$mymeters = [ordered]@{}
"Here is item '500 HR': {0}" -f $mymeters['500 HR']
</code></pre>
<p>如果您习惯于Python3的<code>f</code>字符串,那么<code>-f</code>应该会觉得很熟悉,但有一点需要注意的是,PowerShell的<code>-f</code>操作符是<a href="https://docs.microsoft.com/en-us/dotnet/api/system.string.format?view=net-5.0" rel="nofollow noreferrer">^{<cd16>}</a>的薄型包装,并且<code>String.Format()</code><em>只支持基于0的占位符-<code>'{0} {1}' -f 1,2</code>是有效的,而<code>'{} {}' -f 1,2</code>不是</p>
<p>另一个选项是将表达式包装在双引号字符串文字中的<code>$()</code>子表达式运算符中:</p>
<pre><code>$mymeters = [ordered]@{}
"Here is item '500 HR': $($mymeters['500 HR'])"
</code></pre>
<p>请注意,PowerShell中的字典支持使用<code>[]</code>键控索引访问,就像Python一样:)</p>
<hr/>
<p>与Python不同的是,PowerShell(以及.NET)也具有强大的<em>内省</em>功能</p>
<p>动态发现和迭代任何对象的属性就像引用名为<code>psobject</code>的特殊成员一样简单:</p>
<pre><code>foreach($propertyMetadataEntry in $someObject.psobject.Properties){
"Property: {0,-20} = {1}" -f $propertyMetadataEntry.Name,$propertyMetadataEntry.Value
}
</code></pre>
<p>或者在您的情况下:</p>
<pre><code>$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 :)
}
</code></pre>
<p>这将适用于任何<em>标量</em>对象(如<code>ConvertFrom-Json</code>或<code>Invoke-RestMethod</code>返回的对象)</p>
<p>要迭代<em>字典</em>中的条目,需要显式调用^{<cd25>:</p>
<pre><code>$dictionary = [ordered]@{ A = 1; B = 2; C =3 }
foreach($keyValuePair in $dictionary.GetEnumerator()){
"Dictionary Entry: {0} = {1}" -f $keyValuePair.Key,$keyValuePair.Value
}
</code></pre>