Estoy usando este fragmento de código (simplificado) para extraer un conjunto de tablas de SQL Server con 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
}
Funciona muy bien, pero ahora algunas de las tablas deben extraerse a través de vistas y otras no. Entonces necesito una estructura de datos como esta:
"Page" "vExtractPage"
, "ChecklistItemCategory" "ChecklistItemCategory"
, "ChecklistItem" "vExtractChecklistItem"
Estaba buscando hashes, pero no encuentro nada sobre cómo recorrer un hash. ¿Qué sería lo correcto para hacer aquí? ¿Quizás solo use una matriz, pero con ambos valores, separados por espacio?
¿O me estoy perdiendo algo obvio?
powershell
Sylvia
fuente
fuente
$hash.Item($_)
lugar de$hash[$_]
?$hash.$_
.No se prefiere la taquigrafía para los guiones; es menos legible. El operador% {} se considera taquigrafía. Así es como se debe hacer en un script para mejorar la legibilidad y la reutilización:
Configuración variable
Opción 1: GetEnumerator ()
Nota: preferencia personal; la sintaxis es más fácil de leer
El método GetEnumerator () se haría como se muestra:
Salida:
Opción 2: llaves
El método Keys se haría como se muestra:
Salida:
Información Adicional
Tenga cuidado al ordenar su tabla hash ...
Sort-Object puede cambiarlo a una matriz:
Este y otros bucles de PowerShell están disponibles en mi blog.
fuente
ForEach-Object
, que es diferente a laforeach
declaración aquí.ForEach-Object
hace uso de la canalización, que puede ser mucho más rápida si ya está trabajando con una canalización. Laforeach
declaración no lo hace; es un bucle simple.ForEach-Object
(también conocido como:)%{}
es más rápido queforeach
; Demostré que no es más rápido . Quería demostrar si su punto era válido o no; porque, como la mayoría de la gente, me gusta que mi código se ejecute lo más rápido posible. Ahora, su argumento está cambiando a ejecutar trabajos en paralelo (potencialmente usando múltiples computadoras / servidores) ... lo que por supuesto es más rápido que ejecutar un trabajo en serie desde un solo hilo. ¡Salud!También puede hacer esto sin una variable
fuente
Acerca de recorrer un hash:
fuente
Aquí hay otra forma rápida, simplemente usando la clave como un índice en la tabla hash para obtener el valor:
fuente
Prefiero esta variante en el método de enumerador con una canalización, porque no tiene que consultar la tabla hash en el foreach (probado en PowerShell 5):
Salida:
Ahora, esto no se ha ordenado deliberadamente por valor, el enumerador simplemente devuelve los objetos en orden inverso.
Pero como se trata de una canalización, ahora puedo ordenar los objetos recibidos del enumerador por valor:
Salida:
fuente
$x = @{a = 1; z = 2}; $x.q = 3
está "ordenado" como q, a, z aquí.[ordered]
Si está usando PowerShell v3, puede usar JSON en lugar de una tabla hash y convertirlo en un objeto con Convert-FromJson :
fuente