使用名为长度的键的 powershell 哈希表
powershell hashtable using key named length
当其中一个键名为 "length" 时,我在解析具有键值对的文件时遇到问题。将内容通过管道传输到 ConvertFrom-StringData 会创建一个散列 table,其键名为 "length",但是,当我尝试访问它时,我得到的是 table 的长度。事实证明这是因为 ConvertFrom-StringData 正在返回一个哈希数组 tables 并且 Length 是数组的长度(在本例中为 6)。
知道如何解决这个问题吗?对于常规散列table,您可以创建一个名为 length 的密钥并正常访问它($tmp[1].length 应该给出 1000um)。但是,我通常不知道文件中 "length" 字段的索引。
> $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
使用IndexOf()
获取索引,然后使用它获取值:
$li = $tmp.keys.IndexOf('length')
$tmp[$li].length
将 -replace
与正则表达式一起使用以在 length
前添加一个字符串(此处为 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
要获得 常规 哈希表,请使用 -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
当其中一个键名为 "length" 时,我在解析具有键值对的文件时遇到问题。将内容通过管道传输到 ConvertFrom-StringData 会创建一个散列 table,其键名为 "length",但是,当我尝试访问它时,我得到的是 table 的长度。事实证明这是因为 ConvertFrom-StringData 正在返回一个哈希数组 tables 并且 Length 是数组的长度(在本例中为 6)。
知道如何解决这个问题吗?对于常规散列table,您可以创建一个名为 length 的密钥并正常访问它($tmp[1].length 应该给出 1000um)。但是,我通常不知道文件中 "length" 字段的索引。
> $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
使用IndexOf()
获取索引,然后使用它获取值:
$li = $tmp.keys.IndexOf('length')
$tmp[$li].length
将 -replace
与正则表达式一起使用以在 length
前添加一个字符串(此处为 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
要获得 常规 哈希表,请使用 -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