2012-05-22 14 views
5

Sto cercando di implementare un provider PowerShell in PowerShell.Implementare PowerShell PSProvider * in * PowerShell

Continuo a pensare che se solo definisco i tipi, quindi li importa nella mia sessione (modulo di importazione), dovrei essere in grado di averli disponibili.

Ad esempio, questo non funziona ma è lungo il percorso di ciò che mi piacerebbe implementare.

Ovviamente mi manca un bel po '... qualcuno sa se questo è possibile?

# 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 

Dopo Import-Module, cerco di creare le "ambienti" di unità:

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

errori con:

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

Supponendo che il provider in realtà ha funzionato, forse ce l'ha restituito un elenco degli ambienti: dev, qa, staging, produzione.

Poi mi piacerebbe essere in grado di ri-utilizzare questo attraverso:

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] 

risposta

6

consiglio vivamente guardando la roba Oisin ha scritto, indagato per persone come te, che possono afferrare la loro testa intorno ad esso , potrebbe essere un'ottima referenza su come fare. O forse cosa evitare? ;) Puoi trovarlo su codeplex: http://psprovider.codeplex.com/

+0

Mentre non implementato interamente in PowerShell, questo sembra che sarà perfetto, grazie! –

2

So che è passato un po 'di tempo da quando hai fatto la domanda, ma ho cercato personalmente quella stessa risposta. Come succede, rileggendo gli esempi in msdn finalmente mi ha dato la mia risposta, e dato il quoziente di frustrazione che pensavo di condividere:

L'assembly che contiene il provider deve essere importato usando Import-Module (non solo il modulo contenente la dichiarazione del tipo di aggiunta). Questa operazione può essere eseguita in due modi:

Opzione 1: Utilizzare il parametro Add-Type che crea l'assieme di runtime come file .dll e importa il file.

Opzione 2: Importare il runtime dalla memoria. Questo è quanto ho fatto con i campioni standard MSDN:

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

sostituire il nome del provider nel filtro in cui con il vostro.

Cheers, Fred

+0

Hey Fred - sono passati 3 anni da quando hai postato quell'aggiornamento, ma mi ha aiutato moltissimo. Avevo visto quelle pagine personalizzate del provider di accesso * molti * anni fa e le ho ricordate, oggi le ho cercate ma il codice sorgente non è più disponibile sul sito di Microsoft - ma il tuo riferimento ha funzionato. Grazie molto! – DanW