Saya menggunakan potongan kode (yang disederhanakan) ini untuk mengekstrak satu set tabel dari SQL Server dengan 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
}
Ini berfungsi dengan baik, tetapi sekarang beberapa tabel perlu diekstraksi melalui tampilan, dan beberapa tidak. Jadi saya membutuhkan struktur data seperti ini:
"Page" "vExtractPage"
, "ChecklistItemCategory" "ChecklistItemCategory"
, "ChecklistItem" "vExtractChecklistItem"
Saya melihat hash, tetapi saya tidak menemukan apa pun tentang cara mengulang melalui hash. Apa hal benar yang harus dilakukan di sini? Mungkin hanya menggunakan larik, tetapi dengan kedua nilai, dipisahkan oleh spasi?
Atau apakah saya melewatkan sesuatu yang jelas?
sumber
$hash.Item($_)
bukan$hash[$_]
?$hash.$_
.Singkatan tidak disukai untuk skrip; itu kurang terbaca. Operator% {} dianggap singkatan. Inilah cara melakukannya dalam skrip agar terbaca dan dapat digunakan kembali:
Variabel Setup
Opsi 1: GetEnumerator ()
Catatan: preferensi pribadi; sintaks lebih mudah dibaca
Metode GetEnumerator () akan dilakukan seperti yang ditunjukkan:
Keluaran:
Opsi 2: Kunci
Metode kunci akan dilakukan seperti yang ditunjukkan:
Keluaran:
Informasi tambahan
Hati-hati saat menyortir hashtable Anda ...
Sort-Object dapat mengubahnya menjadi array:
Ini dan perulangan PowerShell lainnya tersedia di blog saya.
sumber
ForEach-Object
, yang berbeda denganforeach
pernyataan di sini.ForEach-Object
memanfaatkan pipa, yang bisa jauh lebih cepat jika Anda sudah bekerja dengan pipa. Theforeach
pernyataan tidak; itu lingkaran sederhana.ForEach-Object
(alias:)%{}
lebih cepat dariforeach
; Saya menunjukkan bahwa tidak lebih cepat . Saya ingin menunjukkan apakah maksud Anda valid atau tidak; karena saya, seperti kebanyakan orang, suka kode saya berjalan secepat mungkin. Sekarang, argumen Anda berubah menjadi menjalankan pekerjaan secara paralel (berpotensi menggunakan banyak komputer / server) ... yang tentu saja lebih cepat daripada menjalankan pekerjaan secara seri dari satu thread. Bersulang!Anda juga dapat melakukan ini tanpa variabel
sumber
Tentang perulangan melalui hash:
sumber
Berikut cara cepat lainnya, cukup gunakan kunci sebagai indeks ke dalam tabel hash untuk mendapatkan nilainya:
sumber
Saya lebih suka varian ini pada metode enumerator dengan pipa, karena Anda tidak perlu merujuk ke tabel hash di bagian depan (diuji di PowerShell 5):
Keluaran:
Sekarang, ini belum secara sengaja diurutkan berdasarkan nilai, enumerator hanya mengembalikan objek dalam urutan terbalik.
Tetapi karena ini adalah pipeline, saya sekarang dapat mengurutkan objek yang diterima dari enumerator berdasarkan nilai:
Keluaran:
sumber
$x = @{a = 1; z = 2}; $x.q = 3
"diurutkan" sebagai q, a, z di sini.[ordered]
atribut memicu pemilihan implementasi yang berbeda.Jika Anda menggunakan PowerShell v3, Anda dapat menggunakan JSON sebagai ganti hashtable, dan mengonversinya menjadi objek dengan Convert-FromJson :
sumber