PowerShell i SQL 18 – ładowanie bibliotek SMO

6-Lis-2016

To będzie krótki wpis…

Jeśli planujesz wykorzystywać SMO , to swój skrypt zawsze musisz rozpocząć od załadowania odpowiednich bibliotek .NET. Pamiętanie nazw tych bibliotek jest… uciążliwe, więc jeśli już decydujesz się używać SMO to prawdopodobnie swoje skrypty rozpoczniesz od kilku instrukcji LoadAssembly np.:

[Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO")
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO")
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SmoExtended")
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.ConnectionInfo")
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SmoEnum")

Ale można prościej. Pod adresem https://github.com/rbellamy/WindowsPowerShell/blob/master/Scripts/pssql-smo.ps1 znajduje się skrypt, który ładowanie bibliotek wykona za ciebie i na dodatek zrobi to w inteligentny sposób, kontrolując między innymi błędy do których mogło po drodze dojść. W swoim skrypcie wystarczy tylko dodać instrukcję wywołującą ten skrypt (w bieżącej powłoce PowerShell więc z kropką na początku):

. \library\pssql-smo.ps1

Poniżej wklejam oryginalny skrypt- ale zaznaczam – aktualną wersję znajdziesz pod wskazanym wcześniej adresem

#
# Loads the SQL Server Management Objects (SMO)
#
$ErrorActionPreference = "Stop"
$sqlpsreg="HKLM:\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.SqlServer.Management.PowerShell.sqlps"
if (Get-ChildItem $sqlpsreg -ErrorAction "SilentlyContinue")
{
 throw "SQL Server Provider for Windows PowerShell is not installed."
}
else
{
 $item = Get-ItemProperty $sqlpsreg
 $sqlpsPath = [System.IO.Path]::GetDirectoryName($item.Path)
}
$assemblylist = 
"Microsoft.SqlServer.Management.Common",
"Microsoft.SqlServer.Smo",
"Microsoft.SqlServer.Dmf ",
"Microsoft.SqlServer.Instapi ",
"Microsoft.SqlServer.SqlWmiManagement ",
"Microsoft.SqlServer.ConnectionInfo ",
"Microsoft.SqlServer.SmoExtended ",
"Microsoft.SqlServer.SqlTDiagM ",
"Microsoft.SqlServer.SString ",
"Microsoft.SqlServer.Management.RegisteredServers ",
"Microsoft.SqlServer.Management.Sdk.Sfc ",
"Microsoft.SqlServer.SqlEnum ",
"Microsoft.SqlServer.RegSvrEnum ",
"Microsoft.SqlServer.WmiEnum ",
"Microsoft.SqlServer.ServiceBrokerEnum ",
"Microsoft.SqlServer.ConnectionInfoExtended ",
"Microsoft.SqlServer.Management.Collector ",
"Microsoft.SqlServer.Management.CollectorEnum",
"Microsoft.SqlServer.Management.Dac",
"Microsoft.SqlServer.Management.DacEnum",
"Microsoft.SqlServer.Management.Utility"
foreach ($asm in $assemblylist)
{
 $asm = [Reflection.Assembly]::LoadWithPartialName($asm)
}
Push-Location
cd $sqlpsPath
update-FormatData -prependpath SQLProvider.Format.ps1xml 
Pop-Location

Dodaj komentarz:

Autor: Rafał Kraik