Une boucle dans une table de hachage, ou à l'aide d'un tableau en PowerShell
Je suis en utilisant ce simple bout de code pour extraire un ensemble de tables de SQL Server avec BCP.
$OutputDirectory = "c:\junk\"
$ServerOption = "-SServerName"
$TargetDatabase = "Content.dbo."
$ExtractTables = @(
"Page"
, "ChecklistItemCategory"
, "ChecklistItem"
)
for ($i=0; $i -le $ExtractTables.Length – 1; $i++) {
$InputFullTableName = "$TargetDatabase$($ExtractTables[$i])"
$OutputFullFileName = "$OutputDirectory$($ExtractTables[$i])"
bcp $InputFullTableName out $OutputFullFileName -T -c $ServerOption
}
Il fonctionne très bien, mais maintenant certaines des tables doivent être extraites via des points de vue, et certains ne le font pas. J'ai donc besoin d'une structure de données à quelque chose comme ceci:
"Page" "vExtractPage"
, "ChecklistItemCategory" "ChecklistItemCategory"
, "ChecklistItem" "vExtractChecklistItem"
J'ai été à la recherche à la hache, mais je ne trouve rien sur comment faire une boucle à travers une table de hachage. Quelle serait la bonne chose à faire ici? Peut-être juste utiliser un tableau, mais avec ces deux valeurs, séparées par l'espace?
Ou ai-je raté quelque chose d'évident?
Vous devez vous connecter pour publier un commentaire.
Christian réponse fonctionne bien et vous montre comment vous pouvez faire une boucle à travers chaque table de hachage élément à l'aide de la
GetEnumerator
méthode. Vous pouvez également faire une boucle par l'aide de lakeys
de la propriété. Voici un exemple comment:De sortie:
$hash.Item($_)
au lieu de$hash[$_]
?$hash.$_
.Abréviation n'est pas recommandée pour les scripts, c'est moins lisible. L' %{} l'opérateur est considéré comme abréviation. Voici comment il devrait être fait dans un script pour la lisibilité et la réutilisabilité:
Variable De Configuration
Option 1: GetEnumerator()
Remarque: les préférences personnelles; la syntaxe est plus facile à lire
La GetEnumerator() la méthode serait fait comme indiqué:
De sortie:
Option 2: Touches
La méthode de Clés serait fait comme indiqué:
De sortie:
Des informations supplémentaires
Être prudent tri de la table de hachage...
Tri-Objet peut changer en un tableau:
Ceci et d'autres PowerShell en boucle sont disponibles sur mon blog.
ForEach-Object
, qui est différente de laforeach
déclaration ici.ForEach-Object
rend l'utilisation de la canalisation, ce qui peut être beaucoup plus rapide si vous travaillez déjà avec un pipeline. Leforeach
déclaration n'est pas; c'est une simple boucle.ForEach-Object
(aka:%{}
) est plus rapide queforeach
; j'ai montré que ce n'est pas plus rapide. Je voulais démontrer, si votre point de vue est valide ou pas, parce que moi, comme la plupart des gens, comme mon code pour courir aussi vite que possible. Maintenant, votre argument est en train de changer à l'exécution de travaux en parallèle (éventuellement à l'aide de plusieurs ordinateurs/serveurs) ... ce qui bien sûr est plus rapide que l'exécution d'un travail en série à partir d'un seul fil. Cheers!Ici est une autre façon rapide, juste à l'aide de la clé comme un index dans la table de hachage pour obtenir la valeur:
Sur une boucle dans une table de hachage:
Vous pouvez également le faire sans une variable
Je préfère cette variante, l'agent recenseur méthode avec un pipeline, parce que vous n'avez pas à vous référer à la table de hachage dans le foreach (testé en PowerShell 5):
De sortie:
Maintenant, cela n'a pas été délibérément triés sur la valeur, l'agent recenseur renvoie simplement les objets dans l'ordre inverse.
Mais puisque c'est un pipeline, j'ai maintenant possible de trier les objets reçus de l'agent recenseur sur la valeur:
De sortie:
$x = @{a = 1; z = 2}; $x.q = 3
est "ordonné" que q,a,z ici.[ordered]
attribut déclenche la sélection de la mise en œuvre différente.Si vous êtes à l'aide de PowerShell v3, vous pouvez utiliser JSON au lieu d'une table de hachage, et la convertir en un objet avec Convertir-FromJson: