2012-05-22 12 views
5

Estoy buscando implementar un proveedor de PowerShell en PowerShell.Implementar PowerShell PSProvider * en * PowerShell

Sigo pensando que si solo defino los tipos, entonces los importo a mi sesión (módulo de importación), debería poder tenerlos disponibles.

Por ejemplo, este no funciona pero está en la ruta de lo que me gustaría implementar.

Obviamente me falta mucho ... ¿Alguien sabe si esto es posible?

# 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 

Después de la importación-módulo, trato de crear los "entornos" unidad:

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

errores con:

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

Suponiendo que el proveedor no funcionaba, tal vez tenga que devolver una lista de entornos: dev, qa, montaje, producción.

Entonces me gustaría ser capaz de volver a utilizar este medio de:

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] 

Respuesta

6

Me gustaría fuertemente recomiendo mirar las cosas Oisin escribió, sospechoso para la gente como usted, que puede agarrar su cabeza alrededor de ella , esa podría ser una muy buena referencia sobre cómo hacerlo. O tal vez, ¿qué evitar? ;) Lo puede encontrar en codeplex: http://psprovider.codeplex.com/

+0

Si bien no se han aplicado en su totalidad en PowerShell, esto parece que va a ser perfecto, gracias! –

2

Sé que ha pasado un tiempo desde que hizo la pregunta, pero he estado buscando esa misma respuesta yo mismo. Da la casualidad de que, al volver a leer las muestras en msdn, finalmente obtuve mi respuesta, y dado el cociente de frustración que pensé compartiría:

El conjunto que contiene el proveedor debe importarse utilizando Import-Module (no solo el módulo que contiene la declaración de tipo de complemento). Esto se puede hacer de dos maneras:

Opción 1: Use el parámetro de Add-Type que crea el ensamblado en tiempo de ejecución como un archivo .dll e importa el archivo.

Opción 2: Importe el ensamblaje del tiempo de ejecución de la memoria. Esta es la forma en que lo hice con el estándar de muestras de MSDN:

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

reemplazar el nombre del proveedor en el filtro, donde con su propio.

Saludos, Fred

+0

Hola Fred - ahora son 3 años después de que publicaste esa actualización, pero me ayudó tremendamente. Había visto esas páginas personalizadas de proveedores de acceso * hace muchos * años y las recordaba, hoy las busqué pero el código fuente ya no está disponible en el sitio de Microsoft, pero su referencia hizo el trabajo. ¡Muchas gracias! – DanW