Estou usando esse pedaço (simplificado) de código para extrair um conjunto de tabelas do SQL Server com 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 muito bem, mas agora algumas tabelas precisam ser extraídas por meio de visualizações e outras não. Portanto, preciso de uma estrutura de dados semelhante a esta:
"Page" "vExtractPage"
, "ChecklistItemCategory" "ChecklistItemCategory"
, "ChecklistItem" "vExtractChecklistItem"
Eu estava olhando hashes, mas não estou encontrando nada sobre como fazer um loop em um hash. Qual seria a coisa certa a fazer aqui? Talvez use apenas um array, mas com ambos os valores, separados por espaço?
Ou estou perdendo algo óbvio?
powershell
Sylvia
fonte
fonte
$hash.Item($_)
vez de$hash[$_]
?$hash.$_
.A abreviação não é preferida para scripts; é menos legível. O operador% {} é considerado uma abreviação. Veja como isso deve ser feito em um script para legibilidade e reutilização:
Configuração de Variável
Opção 1: GetEnumerator ()
Nota: preferência pessoal; sintaxe é mais fácil de ler
O método GetEnumerator () seria feito conforme mostrado:
Resultado:
Opção 2: Chaves
O método das Chaves seria feito conforme mostrado:
Resultado:
Informação adicional
Tenha cuidado ao classificar sua tabela de hash ...
Sort-Object pode alterá-lo para uma matriz:
Este e outros looping do PowerShell estão disponíveis no meu blog.
fonte
ForEach-Object
, que é diferente daforeach
declaração aqui.ForEach-Object
faz uso do pipeline, que pode ser muito mais rápido se você já estiver trabalhando com um pipeline. Aforeach
declaração não; é um loop simples.ForEach-Object
(aka :)%{}
é mais rápido do queforeach
; Mostrei que não é mais rápido . Eu queria demonstrar se seu ponto era válido ou não; porque eu, como a maioria das pessoas, gosto que meu código seja executado o mais rápido possível. Agora, seu argumento está mudando para a execução de trabalhos em paralelo (potencialmente usando vários computadores / servidores) ... o que, obviamente, é mais rápido do que executar um trabalho em série a partir de um único thread. Felicidades!Você também pode fazer isso sem uma variável
fonte
Sobre o loop por meio de um hash:
fonte
Aqui está outra maneira rápida, apenas usando a chave como um índice na tabela hash para obter o valor:
fonte
Eu prefiro essa variante no método enumerator com um pipeline, porque você não precisa consultar a tabela de hash no foreach (testado no PowerShell 5):
Resultado:
Agora, isso não foi deliberadamente classificado em valor, o enumerador simplesmente retorna os objetos na ordem reversa.
Mas, como este é um pipeline, agora posso classificar os objetos recebidos do enumerador por valor:
Resultado:
fonte
$x = @{a = 1; z = 2}; $x.q = 3
é "ordenado" como q, a, z aqui.[ordered]
atributo aciona a seleção da implementação diferente.Se estiver usando o PowerShell v3, você pode usar JSON em vez de uma tabela de hash e convertê-lo em um objeto com Convert-FromJson :
fonte