【问题标题】:powershell hashtable using key named length使用名为长度的键的powershell哈希表
【发布时间】:2019-01-24 21:40:31
【问题描述】:

当其中一个键名为“length”时,我在解析具有键值对的文件时遇到问题。将内容传送到 ConvertFrom-StringData 会创建一个带有名为“length”的键的哈希表,但是当我尝试访问它时,我得到的是表的长度。原来这是因为 ConvertFrom-StringData 返回一个哈希表数组,而 Length 是数组的长度(在本例中为 6)。

知道如何解决这个问题吗?对于常规的哈希表,您可以创建一个名为 length 的键并很好地访问它($tmp[1].length 应该给出 1000um)。但是,我通常不知道文件中“长度”字段的索引。

> $tmp = Get-Content "Sample Settings.txt"

> $tmp
device=Hall bar
length=1000um
width=500um
thickness=8nm
system=PPMS
field=Perpendicular

> $tmp = $tmp | ConvertFrom-StringData

> $tmp

Name                           Value                                                                                                                                                                                            
----                           -----                                                                                                                                                                                            
device                         Hall bar                                                                                                                                                                                         
length                         1000um                                                                                                                                                                                           
width                          500um                                                                                                                                                                                            
thickness                      8nm                                                                                                                                                                                              
system                         PPMS                                                                                                                                                                                             
field                          Perpendicular                                                                                                                                                                                    

> $tmp.length
6

> $tmp[1].length
1000um

> $tmp.GetType()

IsPublic IsSerial Name                                     BaseType                                                                                                                                                             
-------- -------- ----                                     --------                                                                                                                                                             
True     True     Object[]                                 System.Array

> $tmp[0].GetType()

IsPublic IsSerial Name                                     BaseType                                                                                                                                                             
-------- -------- ----                                     --------                                                                                                                                                             
True     True     Hashtable                                System.Object  

【问题讨论】:

  • txt 文件的内容可能有用。因为 $tmp 是一个数组,你应该这样对待它。数组索引、foreach 等
  • 顶部 Get-Content 命令的输出是它的样子。
  • 为疏忽道歉。

标签: powershell key hashtable


【解决方案1】:

要获得常规哈希表,使用-Raw开关如下:

$tmp = Get-Content "Sample Settings.txt" -Raw | ConvertFrom-StringData

然后:

$tmp
<#
Name                           Value                                           
----                           -----                                           
device                         Hall bar                                        
thickness                      8nm                                             
field                          Perpendicular                                   
width                          500um                                           
system                         PPMS                                            
length                         1000um                                          
<##>

$tmp.gettype().Name
# Hashtable

$tmp.Count
# 6

$tmp.length
# 1000um

【讨论】:

  • 太棒了。我知道必须有一个简单的方法来做到这一点。谢谢!
【解决方案2】:

使用IndexOf()获取索引,然后使用它获取值:

$li = $tmp.keys.IndexOf('length')
$tmp[$li].length

【讨论】:

    【解决方案3】:

    使用带有正则表达式的-replacelength 前面加上一个字符串(此处为my):

    > $tmp = $tmp -replace '^(?=length)','my' | convertfrom-stringdata
    > $tmp
    Name                           Value
    ----                           -----
    device                         Hall bar
    mylength                       1000um
    width                          500um
    thickness                      8nm
    system                         PPMS
    field                          Perpendicular
    
    > $tmp.mylength
    1000um
    

    (?=..)zero length look ahead assertion

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-29
      • 1970-01-01
      • 2019-02-23
      • 2016-11-28
      • 2012-09-06
      相关资源
      最近更新 更多