хеш-таблица powershell с использованием длины ключа - PullRequest
0 голосов
/ 25 января 2019

У меня проблема с анализом файла с парами ключ-значение, когда один из ключей называется «длина». Передача содержимого в ConvertFrom-StringData создает хеш-таблицу с ключом «длина», но, когда я пытаюсь получить к нему доступ, вместо этого я получаю длину таблицы. Оказывается, это потому, что 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  

Ответы [ 3 ]

0 голосов
/ 25 января 2019

Используйте -replace с RegEx для добавления 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

(?=..) - это утверждение нулевой длины с предварительным просмотром

0 голосов
/ 25 января 2019

Чтобы получить обычную хеш-таблицу, используйте переключатель -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
0 голосов
/ 25 января 2019

Используйте IndexOf(), чтобы получить индекс, а затем используйте его, чтобы получить значение:

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