2 votes

table de hachage powershell utilisant une clé nommée longueur

J'ai un problème pour analyser un fichier contenant des paires clé-valeur lorsque l'une des clés est nommée "length". La conversion du contenu en ConvertFrom-StringData crée une table de hachage avec la clé "length" mais, lorsque j'essaie d'y accéder, j'obtiens la longueur de la table à la place. Il s'avère que c'est parce que ConvertFrom-StringData renvoie un tableau de tables de hachage et que Length est la longueur du tableau (6 dans ce cas).

Une idée sur la manière de contourner ce problème ? Pour une table de hachage normale, vous pouvez créer une clé appelée longueur et y accéder sans problème ($tmp[1].length donne 1000um comme il se doit). Cependant, je ne connais généralement pas l'index du champ "longueur" dans le fichier.

> $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

0voto

Utilisation IndexOf() pour obtenir l'index et l'utiliser ensuite pour obtenir la valeur :

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

0voto

Utilisation -replace avec un RegEx en guise de préambule length avec une chaîne de caractères (ici 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

(?=..) est un zéro length look ahead assertion

0voto

JosefZ Points 15232

Pour obtenir régulière hashtable, utiliser -Raw comme suit :

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

Ensuite :

$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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X