Ich verwende diesen (vereinfachten) Codeabschnitt, um eine Reihe von Tabellen mit BCP aus SQL Server zu extrahieren .
$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
}
Es funktioniert gut, aber jetzt müssen einige der Tabellen über Ansichten extrahiert werden, andere nicht. Ich brauche also eine Datenstruktur wie diese:
"Page" "vExtractPage"
, "ChecklistItemCategory" "ChecklistItemCategory"
, "ChecklistItem" "vExtractChecklistItem"
Ich habe mir Hashes angesehen, aber ich finde nichts darüber, wie man einen Hash durchläuft. Was wäre hier das Richtige? Vielleicht nur ein Array verwenden, aber mit beiden durch Leerzeichen getrennten Werten?
Oder fehlt mir etwas Offensichtliches?
powershell
Sylvia
quelle
quelle
$hash.Item($_)
statt$hash[$_]
?$hash.$_
.Kurzschrift wird für Skripte nicht bevorzugt. es ist weniger lesbar. Der Operator% {} wird als Kurzform betrachtet. So sollte es in einem Skript für Lesbarkeit und Wiederverwendbarkeit gemacht werden:
Variable Einrichtung
Option 1: GetEnumerator ()
Hinweis: persönliche Präferenz; Die Syntax ist leichter zu lesen
Die GetEnumerator () -Methode würde wie folgt ausgeführt:
Ausgabe:
Option 2: Tasten
Die Keys-Methode würde wie folgt durchgeführt:
Ausgabe:
Zusätzliche Information
Seien Sie vorsichtig beim Sortieren Ihrer Hashtabelle ...
Sort-Object kann es in ein Array ändern:
Diese und andere PowerShell-Schleifen sind in meinem Blog verfügbar.
quelle
ForEach-Object
, der sich von derforeach
Anweisung hier unterscheidet.ForEach-Object
nutzt die Pipeline, die viel schneller sein kann, wenn Sie bereits mit einer Pipeline arbeiten. Dieforeach
Aussage nicht; Es ist eine einfache Schleife.ForEach-Object
(aka :)%{}
schneller ist alsforeach
; Ich habe gezeigt, dass das nicht schneller geht . Ich wollte zeigen, ob Ihr Punkt gültig ist oder nicht. weil ich, wie die meisten Leute, möchte, dass mein Code so schnell wie möglich ausgeführt wird. Jetzt wird Ihr Argument dahingehend geändert, dass Jobs parallel ausgeführt werden (möglicherweise mit mehreren Computern / Servern). Dies ist natürlich schneller als das Ausführen eines Jobs in Serie von einem einzelnen Thread aus. Prost!Sie können dies auch ohne Variable tun
quelle
Informationen zum Durchlaufen eines Hashs:
quelle
Ich bevorzuge diese Variante der Enumerator-Methode mit einer Pipeline, da Sie nicht auf die Hash-Tabelle im foreach verweisen müssen (getestet in PowerShell 5):
Ausgabe:
Dies wurde nicht absichtlich nach Wert sortiert, der Enumerator gibt die Objekte einfach in umgekehrter Reihenfolge zurück.
Da dies jedoch eine Pipeline ist, kann ich jetzt die vom Enumerator empfangenen Objekte nach Wert sortieren:
Ausgabe:
quelle
$x = @{a = 1; z = 2}; $x.q = 3
wird hier als q, a, z "geordnet".[ordered]
Hier ist eine weitere schnelle Möglichkeit: Verwenden Sie einfach den Schlüssel als Index für die Hash-Tabelle, um den Wert abzurufen:
quelle
Wenn Sie PowerShell v3 verwenden, können Sie JSON anstelle einer Hashtabelle verwenden und es mit Convert-FromJson in ein Objekt konvertieren :
quelle