2
votes

Hashtable PowerShell utilisant la clé nommée length

J'ai un problème lors de l'analyse d'un fichier avec des paires clé / valeur lorsque l'une des clés est nommée "longueur". La canalisation du contenu vers ConvertFrom-StringData crée une table de hachage avec la clé appelée «length» mais, lorsque j'essaye d'y accéder, j'obtiens la longueur de la table à la place. Il s'avère que cela est dû au fait que ConvertFrom-StringData renvoie un tableau de tables de hachage et Length est la longueur du tableau (6 dans ce cas).

Avez-vous une idée de comment contourner cela? Pour une table de hachage standard, vous pouvez créer une clé appelée length et y accéder très bien ($ tmp [1] .length donne 1000um comme il se doit). Cependant, je ne connais généralement pas l'index du champ "length" 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  


3 commentaires

le contenu de votre fichier txt peut être utile. puisque $ tmp est un tableau, vous devez le traiter comme tel. indexation de tableau, foreach, etc.


La sortie de la commande Get-Content en haut est à quoi elle ressemble.


Toutes mes excuses pour cet oubli.


3 Réponses :


0
votes

Utilisez IndexOf () pour obtenir l'index, puis utilisez-le pour obtenir la valeur:

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


0 commentaires

0
votes

Utilisez -replace avec un RegEx pour ajouter length avec une chaîne (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 une assertion d'anticipation de longueur nulle


0 commentaires

0
votes

Pour obtenir une table de hachage régulière , utilisez le commutateur -Raw comme suit:

$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

Puis:

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


1 commentaires

Brillant. Je savais qu'il devait y avoir un moyen simple de le faire. Merci!