2012-05-22 16 views
5

Szukam wdrożenia PowerShell Provider w PowerShell.Implementacja PowerShell PSProvider * w * PowerShell

Wciąż myślę, że jeśli po prostu zdefiniuję typy, następnie zaimportuję je do mojej sesji (moduł importu), powinienem móc je mieć.

Na przykład to nie działa, ale jest na ścieżce tego, co chciałbym zaimplementować.

Najwyraźniej brakuje mi trochę ... Czy ktoś wie, czy to możliwe?

# 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 

Po Import-Module, staram się stworzyć Drive "środowisk":

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

błędy z:

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

Zakładając usługodawca faktycznie przepracowane, może mieć to zwróci lista środowisk: dev, qa, inscenizacja, produkcja.

Następnie chciałbym móc to ponowne wykorzystywanie przez:

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] 

Odpowiedz

6

Gorąco polecam patrząc na rzeczy Oisin napisał podejrzanego dla ludzi takich jak Ty, który może chwycić głowę wokół niego , to może być bardzo dobre odniesienie do tego, jak to zrobić. A może czego unikać? ;) Możesz go znaleźć na codeplex: http://psprovider.codeplex.com/

+0

Chociaż nie jest realizowany w całości w powershell, to wygląda to będzie idealny, dzięki! –

2

Wiem, że minęło trochę czasu, odkąd zadałeś to pytanie, ale sam szukałem tej samej odpowiedzi. Tak się składa, że ​​ponowne przeczytanie sampli w msdn dało mi w końcu moją odpowiedź i biorąc pod uwagę iloraz frustracji, który myślałem, że się podzielę:

Zestaw zawierający dostawcę musi zostać zaimportowany za pomocą modułu importu (nie tylko moduł zawierający deklarację typu add). Można to zrobić na dwa sposoby:

Opcja 1: Użyj parametru Add-Type, który buduje zestaw środowiska wykonawczego jako plik .dll i importuje plik.

Opcja 2: Zaimportuj zespół środowiska wykonawczego z pamięci. To jest, jak to zrobiłem, że ze standardowymi próbkami MSDN:

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

Wymień nazwę dostawcy w miarę filtra z własną rękę.

Cheers, Fred

+0

Hej Fred - już 3 lata po opublikowaniu tej aktualizacji, ale bardzo mi to pomogło. Widziałem te niestandardowe strony dostawcy dostępu * wiele lat temu i pamiętałem je, dziś ich szukałem, ale kod źródłowy nie jest już dostępny na stronie Microsoftu - ale twoje referencje wykonały zadanie. Wielkie dzięki! – DanW