- Apakah ada cara untuk mengembalikan tipe variabel yang benar/diharapkan saat memanggil
Receive-Job
?
Karena menggunakan pekerjaan latar belakang, Anda kehilangan ketepatan jenis :objek yang Anda dapatkan kembali adalah em>emulasi . tanpa metode dari jenis aslinya.
Membuat ulang tipe asli secara manual tidak sepadan dengan usaha dan bahkan mungkin tidak dapat dilakukan - meskipun mungkin bekerja dengan emulasi sudah cukup.
Perbarui :Sesuai jawaban Anda sendiri, beralih dari bekerja dengan System.DataSet
ke System.DataTable
menghasilkan emulasi yang dapat digunakan untuk Anda.
Lihat bagian bawah untuk informasi lebih lanjut.
- Apakah ada cara yang lebih baik untuk menjalankan kueri SQL di bawah akun AD yang berbeda, menggunakan perintah Invoke-Sqlcmd?
Anda memerlukan dalam proses metode pemanggilan untuk mempertahankan kesetiaan tipe , tapi menurut saya itu tidak mungkin dengan perintah arbitrer jika Anda ingin meniru pengguna lain .
Misalnya, alternatif dalam proses (berbasis utas) untuk Start-Job
- Start-ThreadJob
- tidak memiliki -Credential
parameter.
Oleh karena itu, taruhan terbaik Anda adalah mencoba membuat Invoke-SqlCmd
-Credential
parameter berfungsi untuk Anda atau temukan cara lain dalam proses menjalankan kueri Anda dengan kredensial pengguna tertentu.
Serialization dan deserialisasi objek di pekerjaan latar belakang / remote / mini-shell:
Kapan pun PowerShell mengatur objek melintasi batas proses , ini menggunakan berbasis XML serialisasi di sumbernya, dan deserialisasi di tempat tujuan , menggunakan format yang dikenal sebagai CLI XML (XML Infrastruktur Bahasa Umum).
Ini terjadi dalam konteks remote PowerShell (mis., Invoke-Command
panggilan dengan-ComputerName
parameter) serta di pekerjaan latar belakang (Start-Job
) dan apa yang disebut mini-shells (yang secara implisit digunakan saat Anda memanggil PowerShell CLI dari dalam PowerShell itu sendiri dengan blok skrip; misalnya, powershell.exe { Get-Item / }
).
Deserialization ini mempertahankan tipe fidelitas hanya untuk jenis terbatas yang diketahui , sebagaimana ditentukan dalam MS-PSRP, Spesifikasi Protokol Jarak Jauh PowerShell. Artinya, hanya instance dari kumpulan tipe tetap yang dideserialisasi sebagai tipe aslinya .
Instance dari semua jenis lainnya diemulasi :tipe seperti daftar menjadi [System.Collections.ArrayList]
contoh, tipe kamus menjadi [hasthable]
instance, dan jenis lainnya menjadi tanpa metode (khusus properti) objek khusus ([pscustomobject]
contoh) , yang .pstypenames
-nya properti berisi nama tipe asli yang diawali dengan Deserialized.
(mis., Deserialized.System.Data.DataTable
), serta nama awalan yang sama dari basis . jenis jenis (hierarki pewarisan).
Selain itu, kedalaman rekursi untuk grafik objek non -[pscustomobject]
instance terbatas pada 1
tingkat - perhatikan bahwa ini termasuk instance dari kelas kustom PowerShell , dibuat dengan class
kata kunci:Yaitu, jika nilai properti objek input bukan turunan dari tipe terkenal itu sendiri (yang terakhir termasuk tipe nilai tunggal, termasuk tipe primitif .NET seperti [int]
, sebagai lawan dari tipe yang terdiri dari beberapa properti), mereka diganti dengan .ToString()
representasi (mis., ketik System.IO.DirectoryInfo
memiliki .Parent
properti yang merupakan System.IO.DirectoryInfo
lain instance, yang berarti bahwa .Parent
nilai properti bersambung sebagai .ToString()
representasi dari instance itu, yang merupakan string path lengkapnya); singkatnya:Objek non-kustom (skalar) bersambung sedemikian rupa sehingga nilai properti yang bukan merupakan instance dari tipe terkenal diganti dengan .ToString()
mereka perwakilan ; lihat jawaban ini untuk contoh nyata.
Sebaliknya, eksplisit penggunaan serialisasi XML CLI melalui Export-Clixml
default ke kedalaman 2
(Anda dapat menentukan kedalaman khusus melalui -Depth
dan Anda juga dapat mengontrol kedalaman jika menggunakan System.Management.Automation.PSSerializer
yang mendasarinya ketik langsung ).
Tergantung pada jenis aslinya, Anda mungkin dapat merekonstruksi instance dari tipe aslinya secara manual , tapi itu tidak dijamin.(Anda bisa mendapatkan nama lengkap tipe asli dengan memanggil .pstypenames[0] -replace '^Deserialized\.'
pada objek khusus yang diberikan.)
Namun, bergantung pada kebutuhan pemrosesan Anda, emulasi dari objek aslinya mungkin sudah cukup.