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 Réponses :
Utilisez IndexOf ()
pour obtenir l'index, puis utilisez-le pour obtenir la valeur:
$li = $tmp.keys.IndexOf('length') $tmp[$li].length
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
(? = ..)
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
Brillant. Je savais qu'il devait y avoir un moyen simple de le faire. Merci!
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.