162 votes

Comment charger des assemblages dans PowerShell ?

Le code PowerShell suivant

#Get a server object which corresponds to the default instance
$srv = New-Object -TypeName Microsoft.SqlServer.Management.SMO.Server
... rest of the script ...

Donne le message d'erreur suivant :

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

Toutes les réponses sur Internet indiquent que je dois charger l'assemblage - bien sûr, je peux lire cela dans le message d'erreur :-) - La question est la suivante :

Comment charger l'assemblage et faire fonctionner le script ?

188voto

Keith Hill Points 73162

LoadWithPartialName a été déprécié. La solution recommandée pour PowerShell V3 est d'utiliser la commande Add-Type cmdlet, par exemple :

Add-Type -Path 'C:\Program Files\Microsoft SQL Server\110\SDK\Assemblies\Microsoft.SqlServer.Smo.dll'

Il existe plusieurs versions différentes et vous pouvez choisir une version particulière :-)

1 votes

Bon, j'utilise PowerShell3 - ces commandes d'inclusion semblent très compliquées. Je m'attendrais simplement à quelque chose comme "include filename".

6 votes

PowerShell est insensible à la casse (sauf si vous lui demandez de le faire avec des opérateurs comme -cmatch, -ceq). La casse des noms de commande et des paramètres n'a donc aucune importance.

5 votes

Oui. msdn.microsoft.com/fr/us/library/12xc5368(v=vs.110).aspx Voir la note en haut - This API is now obsolete. Bien sûr, cela n'empêche pas les gens de l'utiliser.

78voto

Shay Levy Points 41404
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo")

9 votes

C'est trop utile pour être déprécié sans être remplacé ! Mon équipe utilise un mélange d'outils clients 2008 et 2012. C'est le seul moyen de faire fonctionner mes scripts PowerShell pour toute mon équipe sans inclure une logique maladroite de retour de version.

4 votes

Vous pouvez envoyer la sortie vers Out-Null si vous ne voulez pas que le GAC fasse écho à des choses.

3 votes

@Baxter -- vous devriez accepter cette réponse ou celle de Keith et laisser la réponse à cette question être marquée.

16voto

Ralph Willgoss Points 3452

Voici quelques articles de blog contenant de nombreux exemples de la façon de charger des assemblages dans PowerShell v1, v2 et v3.

Les voies comprennent :

  • dynamiquement à partir d'un fichier source
  • dynamiquement à partir d'un assemblage
  • en utilisant d'autres types de code, par exemple F#

v1.0 Comment charger des assemblages .NET dans une session PowerShell ?
v2.0 Utilisation de code CSharp (C#) dans les scripts PowerShell 2.0
v3.0 Utilisation des assemblages .NET Framework dans Windows PowerShell

14voto

Yanaki Points 94

Vous pouvez charger l'assemblage *.dll complet avec

$Assembly = [System.Reflection.Assembly]::LoadFrom("C:\folder\file.dll");

1voto

Baxter Points 504

Merci pour vos réponses rapides, j'ai trouvé un excellent exemple de chargement d'assemblages multiples, qui correspond à votre exemple Shay, alors j'ai pensé que je pourrais le partager. Mais apparemment, c'est pour Powershell 2 ou quoi ?

$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)
}

Meilleures salutations

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X