12
votes

PowerShell Hashtable n'écrit pas au fichier comme prévu - recevoir uniquement des lignes "System.Collections"

Quelqu'un peut-il expliquer pourquoi em> strong> mes premiers exemples ne fonctionnent pas et pourquoi l'ajout d'un objet de foresach résout le problème? Merci d'avance!


J'ai analysé le retour d'une commande dans une haquetable (échantillon à la fin de la poste) et souhaitez enregistrer les informations à un fichier dans le cadre de mon traitement. Je sais que $ ht.getenumerator () | Nom de type-objet code> retournera le hachage complet à l'écran, triés. Cependant, une fois que j'essaie d'envoyer des choses au fichier, il se casse. P> xxx pré>

enregistre seulement une seule ligne de System.Collections.hashable code>. Donc, j'ai aussi essayé p> xxx pré>

et finnez avec des lignes de p> xxx pré>

alors j'ai essayé de boucler et gérer chacun individuellement avec p> xxx pré>

et finnez avec p> xxx pré>

résolu avec em>:

$ht = @{
    "Server address" = "server.net";
    "Client address" = "10.20.121.153";
    "User name" = "myuser"
}


0 commentaires

6 Réponses :


5
votes

Votre premier exemple ne fonctionne pas, ni mieux, fonctionne partiellement, car vous essayez d'obtenir une valeur de propriété dans la chaîne. Normalement, à l'intérieur des chaînes, l'analyseur est capable de résoudre uniquement des variables directes (comme $ clé ). Pour résoudre une variable plus complexe, vous avez besoin de parenthèses.

Pour la boucle, cela devrait fonctionner: xxx

ou même meilleur xxx


1 commentaires

Merci pour la solution One-Liner - la brièveté est belle. Bien que je pense que je pense qu'après avoir lu les autres, je me penche vers la combinaison de vos abréviations avec mon type et un format légèrement plus explicite pour la lisibilité.



5
votes

Comme vous pouvez le voir dans Microsoft Documentation, une table de hachage est simplement une collection de paires nom-valeur.

donc $ ht code> est vraiment system.collections.hashastable code> Composé de System.Collections.DictionaryRentryRyRyReRyRY CODE>. P>

Un bon moyen d'utiliser est P>

foreach ($i in $ht.keys)
{
  add-content log.txt ("{0} {1}" -f $i, $ht[$i])
}


1 commentaires

Ah ... donc ma boucle d'origine était si proche. Donc, forcer le formatage convertit vers des chaînes que la teneur en ajoute gère gracieusement. Je t'ai eu.



2
votes

Que diriez-vous:

 $ht.GetEnumerator() | Sort-Object Name | out-string | Add-Content log.txt 


1 commentaires

Intéressant - Cela bénéficie également de crachant les en-têtes également - Ça va être utile quand je veux ceux à l'avenir - merci!



14
votes

Répondre à la partie pourquoi partie, vous avez évidemment une solution :)

dans votre premier exemple xxx

PowerShell prend $ ht et essaie de le convertir en quelque sorte en une chaîne de sorte qu'il puisse être stocké via add-teneur . Parce qu'il n'y a pas de conversion définie pour la haquetable, seul le nom de type est renvoyé de la conversion. Identique que par exemple nouvel objet aléatoire | add-teneur d: \ log.txt . Encore une fois, seul le nom de type est écrit.

suivant xxx

est similaire. getenumerator renvoie l'objet utilisé pour l'itération; Objets de type System.Collections.DictionaryRentryRyRyRyRyRyRyRyRyRY sont retournés. Encore une fois, il n'y a pas de conversion en chaîne, de sorte que les noms de type sont retournés.

Personnellement, je pense que PowerShell devrait être assez intelligent et aider ici. La question est "comment?". Les designers ne souhaitaient probablement pas coder la sortie. Il pourrait être "{clé}: {valeur}" ou "{clé} = {valeur}" ou "{key} / {valeur}" , ou ... le format n'est pas clair, ils l'ont donc laissé pour nous de décider et de formater comme vous l'avez fait avec la relève foreach .


1 commentaires

Merci pour l'explication - je savais qu'il devait être quelque chose avec la conversion à des cordes, je ne saisis pas simplement les mécanismes impliqués. La combinaison de votre élucidation et des exemples plus spécifiques de tous ont aidé immensément!



9
votes

Je suis d'accord avec Mjolinor ... Je ne suis tout simplement pas assez de points pour voter ... Plus je vais ajouter que vous n'avez pas besoin de Getenumerator

$ht | out-string | add-content log.txt


0 commentaires

0
votes

Vous pouvez écrire une vidage "RAW" d'une table de hachage à un fichier ASCII à l'aide de fichiers hors fichier:

$data = @{
  Name = "Something"
  Type = "123"
}
$data | Out-File "myfile.txt" -Encoding ascii


0 commentaires