Implementar PowerShell PSProvider *en* PowerShell

Estoy buscando implementar un proveedor de PowerShell in Potencia Shell.

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

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

Obviamente me estoy perdiendo un poco... ¿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 importar el módulo, trato de crear los "entornos" de la unidad:

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

errores con:

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

Suponiendo que el proveedor realmente funcionó, tal vez haga que devuelva una lista de entornos: desarrollo, control de calidad, puesta en escena, producción.

Entonces me gustaría poder reutilizar esto a través 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]

preguntado el 22 de mayo de 12 a las 21:05

2 Respuestas

Recomiendo encarecidamente mirar las cosas que escribió Oisin, sospechosas para personas como tú, que pueden entenderlo, eso podría ser una muy buena referencia sobre cómo hacerlo. ¿O tal vez qué evitar? ;) Puedes encontrarlo en codeplex: http://psprovider.codeplex.com/

contestado el 22 de mayo de 12 a las 22:05

Si bien no se implementó completamente en PowerShell, parece que será perfecto, ¡gracias! - Zach Bonham

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

El ensamblado que contiene el proveedor debe importarse mediante 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: utilice el parámetro Add-Type que crea el ensamblado en tiempo de ejecución como un archivo .dll e importe el archivo.

Opción 2: importe el ensamblado en tiempo de ejecución desde la memoria. Así es como lo hice con las muestras estándar de msdn:

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

Reemplace el nombre del proveedor en el filtro where con el suyo propio.

saludos, fred

Respondido el 25 de junio de 14 a las 15:06

Hola, Fred: ahora han pasado 3 años desde que publicaste esa actualización, pero me ayudó muchísimo. Había visto esas páginas personalizadas de proveedores de acceso muchas hace años y los recordé, hoy los busqué pero el código fuente ya no está disponible en el sitio de Microsoft, pero su referencia hizo el trabajo. ¡Muchas gracias! - danw

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.