Berikut kode PowerShell
#Get a server object which corresponds to the default instance
$srv = New-Object -TypeName Microsoft.SqlServer.Management.SMO.Server
... rest of the script ...
Memberikan pesan kesalahan berikut:
New-Object : Cannot find type [Microsoft.SqlServer.Management.SMO.Server]: make sure
the assembly containing this type is loaded.
At C:\Users\sortelyn\ ... \tools\sql_express_backup\backup.ps1:6 char:8
+ $srv = New-Object -TypeName Microsoft.SqlServer.Management.SMO.Server
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidType: (:) [New-Object], PSArgumentException
+ FullyQualifiedErrorId : TypeNotFound,Microsoft.PowerShell.Commands.NewObjectCommand
Setiap jawaban di Internet menulis bahwa saya harus memuatnya - tentu saya bisa membacanya dari pesan kesalahan :-) - pertanyaannya adalah:
Bagaimana Anda memuat rakitan dan membuat skrip berfungsi?
powershell
powershell-3.0
Baxter
sumber
sumber
This API is now obsolete.
Tentu saja, itu tidak menghentikan orang untuk menggunakannya.LoadWithPartialName
telah usang, alasannya (sebagaimana diuraikan dalam blogs.msdn.com/b/suzcook/archive/2003/05/30/57159.aspx ) jelas tidak berlaku untuk sesi Powershell interaktif. Saya sarankan Anda menambahkan catatan bahwa API baik untuk penggunaan Powershell interaktif.sumber
Out-Null
jika Anda tidak ingin GAC untuk mengulangi hal-hal.Add-Type -Path [...]; if (!$?) { Add-Type -Path [...] } elseif [...]
.Sebagian besar orang tahu saat
System.Reflection.Assembly.LoadWithPartialName
ini sudah usang, tetapi ternyataAdd-Type -AssemblyName Microsoft.VisualBasic
tidak berperilaku jauh lebih baik daripadaLoadWithPartialName
:Apa yang Microsoft mengatakan Anda benar-benar harus lakukan adalah sesuatu seperti ini:
Atau, jika Anda tahu jalannya, sesuatu seperti ini:
Nama panjang yang diberikan untuk majelis dikenal sebagai nama kuat , yang unik untuk versi dan majelis, dan kadang-kadang juga dikenal sebagai nama lengkap.
Tapi ini menyisakan beberapa pertanyaan:
Bagaimana cara menentukan nama kuat dari apa yang sebenarnya dimuat di sistem saya dengan nama parsial yang diberikan?
[System.Reflection.Assembly]::LoadWithPartialName($TypeName).Location;
[System.Reflection.Assembly]::LoadWithPartialName($TypeName).FullName;
Ini juga harus bekerja:
Jika saya ingin skrip saya selalu menggunakan versi tertentu dari .dll tapi saya tidak bisa memastikan di mana itu diinstal, bagaimana cara menentukan apa nama yang kuat dari.
[System.Reflection.AssemblyName]::GetAssemblyName($Path).FullName;
Atau:
Jika saya tahu nama yang kuat, bagaimana cara menentukan jalur .dll?
[Reflection.Assembly]::Load('Microsoft.VisualBasic, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a').Location;
Dan, dengan nada yang sama, jika saya tahu nama tipe dari apa yang saya gunakan, bagaimana saya tahu dari mana asalnya?
[Reflection.Assembly]::GetAssembly([Type]).Location
[Reflection.Assembly]::GetAssembly([Type]).FullName
Bagaimana cara melihat majelis apa yang tersedia?
Saya menyarankan modul GAC PowerShell .
Get-GacAssembly -Name 'Microsoft.SqlServer.Smo*' | Select Name, Version, FullName
bekerja dengan cukup baik.Add-Type
menggunakan?Ini sedikit lebih rumit. Saya dapat menjelaskan cara mengaksesnya untuk versi PowerShell dengan reflektor .Net (lihat pembaruan di bawah ini untuk PowerShell Core 6.0).
Pertama, cari tahu dari perpustakaan mana
Add-Type
:Buka DLL yang dihasilkan dengan reflektor Anda. Saya telah menggunakan ILSpy untuk ini karena FLOSS, tetapi reflektor C # apa pun harus berfungsi. Buka perpustakaan itu, dan lihat
Microsoft.Powershell.Commands.Utility
. Di bawahMicrosoft.Powershell.Commands
, seharusnya adaAddTypeCommand
.Dalam daftar kode untuk itu, ada kelas privat
InitializeStrongNameDictionary()
,. Itu mencantumkan kamus yang memetakan nama pendek ke nama kuat. Ada hampir 750 entri di perpustakaan yang pernah saya lihat.Pembaruan: Sekarang PowerShell Core 6.0 adalah open source. Untuk versi itu, Anda dapat melewati langkah-langkah di atas dan melihat kode secara online di repositori GitHub mereka . Saya tidak dapat menjamin bahwa kode tersebut cocok dengan versi PowerShell lainnya.
sumber
Add-Type
atauLoadWithPartialName()
, tetapi Anda harus menyadari bahwa yang pertama tidak akan 100% konsisten di seluruh versi dan yang terakhir adalah metode yang usang. Dengan kata lain, .Net ingin Anda peduli dengan versi perpustakaan yang Anda muat.Add-Type -Path
, yang merupakan kode kedua yang disebutkan, atauAssembly.LoadFrom()
yang menyelesaikan dependensi untuk Anda (dan, sejauh yang saya tahu, adalah apaAdd-Type -Path
gunanya). Satu-satunya waktu Anda harus menggunakanAssembly.LoadFile()
adalah jika Anda perlu memuat banyak majelis yang memiliki identitas yang sama tetapi jalur yang berbeda. Itu situasi yang aneh.Jika Anda ingin memuat unit tanpa menguncinya selama durasi sesi PowerShell , gunakan ini:
Di mana
$storageAssemblyPath
filepath dari majelis Anda.Ini sangat berguna jika Anda perlu membersihkan sumber daya dalam sesi Anda. Misalnya dalam skrip penerapan.
sumber
Berikut adalah beberapa posting blog dengan banyak contoh cara memuat rakitan di PowerShell v1, v2 dan v3.
Caranya meliputi:
v1.0 Cara Memuat. NET Assemblies Dalam Sesi PowerShell
v2.0 Menggunakan kode CSharp (C #) dalam skrip PowerShell 2.0
v3.0 Menggunakan .NET Framework Assemblies di Windows PowerShell
sumber
Anda dapat memuat seluruh rakitan * .dll dengan
sumber
Tidak ada jawaban yang membantu saya, jadi saya memposting solusi yang bekerja untuk saya, yang harus saya lakukan adalah mengimpor modul SQLPS, saya menyadari ini ketika secara tidak sengaja saya menjalankan perintah Restore-SqlDatabase dan mulai bekerja, yang berarti bahwa perakitan dirujuk dalam modul itu entah bagaimana.
Lari saja:
Catatan: Terima kasih Jason karena mencatat bahwa SQLPS sudah usang
alih-alih jalankan:
atau
sumber
sqlps
sudah usang mendukung modulsqlserver
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo")
bekerja untukku.sumber
Anda bisa menggunakannya
LoadWithPartialName
. Namun, itu sudah usang seperti yang mereka katakan.Anda memang dapat mengikuti
Add-Type
, dan di samping jawaban lain, jika Anda tidak ingin menentukan path lengkap dari file .dll, Anda cukup melakukan:Bagi saya ini menghasilkan kesalahan, karena saya tidak menginstal SQL Server (saya kira), namun, dengan ide yang sama ini saya dapat memuat perakitan Windows Forms:
Anda dapat menemukan nama perakitan yang tepat milik kelas tertentu di situs MSDN:
sumber
Pastikan Anda memiliki fitur di bawah ini agar diinstal
Anda juga mungkin perlu memuat
sumber
Tambahkan referensi perakitan di bagian atas.
sumber