J'utilise ce morceau de code (simplifié) 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
}
Cela fonctionne très bien, mais maintenant certaines tables doivent être extraites via des vues, et d'autres non. J'ai donc besoin d'une structure de données comme celle-ci:
"Page" "vExtractPage"
, "ChecklistItemCategory" "ChecklistItemCategory"
, "ChecklistItem" "vExtractChecklistItem"
Je regardais les hachages, mais je ne trouve rien sur la façon de parcourir un hachage. Quelle serait la bonne chose à faire ici? Peut-être simplement utiliser un tableau, mais avec les deux valeurs, séparées par un espace?
Ou est-ce que je rate quelque chose d'évident?
la source
$hash.Item($_)
au lieu de$hash[$_]
?$hash.$_
.La sténographie n'est pas préférée pour les scripts; il est moins lisible. L'opérateur% {} est considéré comme un raccourci. Voici comment procéder dans un script pour plus de lisibilité et de réutilisation:
Configuration variable
Option 1: GetEnumerator ()
Remarque: préférence personnelle; la syntaxe est plus facile à lire
La méthode GetEnumerator () serait effectuée comme indiqué:
Production:
Option 2: Clés
La méthode Keys serait effectuée comme indiqué:
Production:
Information additionnelle
Soyez prudent en triant votre hashtable ...
Sort-Object peut le changer en tableau:
Ceci et d'autres boucles PowerShell sont disponibles sur mon blog.
la source
ForEach-Object
, qui est différent de l'foreach
instruction ici.ForEach-Object
utilise le pipeline, qui peut être beaucoup plus rapide si vous travaillez déjà avec un pipeline. Laforeach
déclaration ne le fait pas; c'est une simple boucle.ForEach-Object
(aka:)%{}
est plus rapide queforeach
; J'ai montré que ce n'était pas plus rapide . Je voulais démontrer si votre argument était valable ou non; parce que, comme la plupart des gens, j'aime que mon code s'exécute aussi vite que possible. Maintenant, votre argument est de changer pour exécuter des travaux en parallèle (en utilisant potentiellement plusieurs ordinateurs / serveurs) ... ce qui est bien sûr plus rapide que d'exécuter un travail en série à partir d'un seul thread. À votre santé!Vous pouvez également le faire sans variable
la source
À propos de la boucle sur un hachage:
la source
Voici un autre moyen rapide, en utilisant simplement la clé comme index dans la table de hachage pour obtenir la valeur:
la source
Je préfère cette variante à la méthode de l'énumérateur avec un pipeline, car vous n'avez pas à vous référer à la table de hachage dans le foreach (testé dans PowerShell 5):
Production:
Maintenant, cela n'a pas été délibérément trié sur la valeur, l'énumérateur renvoie simplement les objets dans l'ordre inverse.
Mais comme il s'agit d'un pipeline, je peux maintenant trier les objets reçus de l'énumérateur sur la valeur:
Production:
la source
$x = @{a = 1; z = 2}; $x.q = 3
est "ordonné" comme q, a, z ici.[ordered]
attribut déclenche la sélection de l'implémentation différente.Si vous utilisez PowerShell v3, vous pouvez utiliser JSON au lieu d'une table de hachage et le convertir en objet avec Convert-FromJson :
la source