2012-05-22 3 views
5

Ich bin auf der Suche nach einem PowerShell Provider in PowerShell zu implementieren.Implementieren PowerShell PSProvider * in * PowerShell

Ich denke, dass, wenn ich nur die Typen definieren, dann importieren Sie sie in meine Sitzung (Import-Modul), sollte ich in der Lage sein, sie verfügbar zu haben.

Zum Beispiel funktioniert diese nicht aber es ist entlang des Weges von dem, was ich gerne implementieren würde.

Mir fehlt natürlich einiges ... weiß jemand, ob das möglich ist?

# EnvironmentProvider.ps1 
    $reference_assemblies = (

     "System.Management.Automation, Version=1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" 
    # "System.Configuration.Install, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" 
    ) 

    $source = @" 

    namespace Providers 
    { 

    using System.Management.Automation; 
    using System.Management.Automation.Provider; 


     [CmdletProvider("Environments", ProviderCapabilities.None)] 
     public class EnvironmentProvider : DriveCmdletProvider 
     { 
      protected override PSDriveInfo NewDrive(PSDriveInfo drive) 
      { 
       return new EnvironmentDriveInfo(drive); 
      } 

      protected override object NewDriveDynamicParameters() 
      { 
       return base.NewDriveDynamicParameters(); 
      } 

     } 

     public class EnvironmentDriveInfo : PSDriveInfo 
     { 
      public EnvironmentDriveInfo(PSDriveInfo driveInfo) : base(driveInfo) 
      { 
      } 
     } 


    } 
    "@ 

    # -ea silentlycontinue in case its already loaded 
    # 
    add-type -referencedassemblies $referenced_assemblies -typedefinition $source -language CSharp -erroraction silentlycontinue 

Nach dem Import-Modul, ich versuche, den Antrieb "Umgebungen" zu erstellen:

new-psdrive -psprovider Environments -name "Environments" -root "" 

Fehler mit:

New-PSDrive : Cannot find a provider with the name 'Environments'. 

der Anbieter tatsächlich gearbeitet Unter der Annahme, vielleicht haben sie eine Rückkehr Liste der Umgebungen: dev, qa, Inszenierung, Produktion.

Dann würde Ich mag Lage sein, diese wieder verwenden durch:

c:\adminlib>import-module .\EnvironmentProvider.ps1 
c:\adminlib>environments: 

environments:>ls 
dev 
qa 
staging 
production 

environments:> cd production 
environments\production> [execute actions against production] 

environments\production:> cd dev 
environments\dev:> [execute actions against dev, etc] 

Antwort

6

würde ich stark am Material der Suche empfehlen Oisin schrieb, Verdächtige für Leute wie Sie, die ihren Kopf herum greifen , das könnte sehr gute Referenz auf How-To sein. Oder vielleicht was zu vermeiden? ;) Sie können es auf Codeplex finden: http://psprovider.codeplex.com/

+0

Während nicht vollständig in Powershell implementiert, das sieht aus wie es perfekt sein, danke! –

2

Ich weiß, es ist eine Weile her, seit Sie die Frage gestellt haben, aber ich habe selbst nach der gleichen Antwort gesucht. Zufälligerweise bekam ich die Antwort in msdn und bekam den Frustrationsquotienten, den ich mir teilen wollte:

Die Assembly, die den Provider enthält, muss mit Import-Module importiert werden (nicht nur die Modul mit der Add-Type-Deklaration). Dies kann auf zwei Arten geschehen:

Option 1: Verwenden Sie den Parameter Add-Type, der die Laufzeitbaugruppe als DLL-Datei erstellt, und importieren Sie die Datei.

Option 2: Importieren Sie die Laufzeitbaugruppe aus dem Speicher. Dies ist, wie ich tat, mit den Standard-Msdn Proben:

[appdomain]::CurrentDomain.GetAssemblies() | Where {$_.ExportedTypes -ne $null} | Where {($_.ExportedTypes | Select -ExpandProperty "Name") -contains "AccessDBProvider"} | Import-Module 

den Namen des Anbieters ersetzt in den where-Filter mit Ihrem eigenen.

Cheers, Fred

+0

Hey Fred - es ist jetzt 3 Jahre, nachdem du dieses Update gepostet hast, aber es hat mir enorm geholfen. Ich hatte diese benutzerdefinierten Access-Provider-Seiten vor vielen Jahren gesehen und erinnerte mich daran, heute habe ich nach ihnen gesucht, aber der Quellcode ist nicht mehr auf Microsofts Website verfügbar - aber Ihre Referenz hat den Job erledigt. Danke vielmals! – DanW