Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Este tema describe cómo crear un proveedor de navegación PowerShell para Windows que pueda navegar por el almacén de datos. Este tipo de proveedor soporta comandos recursivos, contenedores anidados y rutas relativas.
Nota:
Puedes descargar el archivo fuente (AccessDBSampleProvider05.cs) en C# de este proveedor utilizando el Microsoft Windows Software Development Kit para Windows Vista y los componentes de ejecución de .NET Framework 3.0. Para las instrucciones de descarga, consulta Cómo instalar Windows PowerShell y descargar el SDK de Windows PowerShell. Los archivos fuente descargados están disponibles en el <directorio de Ejemplos> de PowerShell. Para más información sobre otras implementaciones de proveedores de Windows PowerShell, consulte Diseñando su proveedor de PowerShell para Windows.
El proveedor descrito aquí permite al usuario gestionar una base de datos Access como una unidad para que pueda navegar a las tablas de datos de la base de datos. Al crear tu propio proveedor de navegación, puedes implementar métodos que permitan crear rutas calificadas para la unidad necesarias para la navegación, normalizar rutas relativas, mover elementos del almacén de datos, así como métodos que obtengan nombres hijos, obtengan la ruta padre de un elemento y prueben si un elemento es un contenedor.
Precaución
Ten en cuenta que este diseño asume una base de datos que tiene un campo con el ID del nombre, y que el tipo del campo es LongInteger.
Defina el proveedor PowerShell de Windows
Un proveedor de navegación PowerShell de Windows debe crear una clase .NET que derive de la clase base System.Management.Automation.Provider.NavigationCmdletProvider . Aquí está la definición de clase para el proveedor de navegación descrito en esta sección.
[CmdletProvider("AccessDB", ProviderCapabilities.None)]
public class AccessDBProvider : NavigationCmdletProvider
Ten en cuenta que en este proveedor, el atributo System.Management.Automation.Provider.CmdletProviderAttribute incluye dos parámetros. El primer parámetro especifica un nombre fácil de usar para el proveedor que utiliza Windows PowerShell. El segundo parámetro especifica las capacidades específicas de PowerShell de Windows que el proveedor expone al entorno de ejecución de Windows PowerShell durante el procesamiento de comandos. Para este proveedor, no se añaden capacidades específicas de PowerShell de Windows.
Definición de la funcionalidad base
Como se describe en Design Your PS Provider, la clase base System.Management.Automation.Provider.NavigationCmdletProvider deriva de varias otras clases que proporcionaban diferentes funcionalidades de proveedores. Por tanto, un proveedor de navegación Windows PowerShell debe definir toda la funcionalidad proporcionada por esas clases.
Para implementar funcionalidades para añadir información de inicialización específica de la sesión y para liberar recursos que utiliza el proveedor, consulte Creación de un proveedor básico de PS. Sin embargo, la mayoría de los proveedores (incluido el que se describe aquí) pueden utilizar la implementación predeterminada de esta funcionalidad proporcionada por Windows PowerShell.
Para acceder al almacén de datos a través de una unidad PowerShell de Windows, debes implementar los métodos de la clase base System.Management.Automation.Provider.DriveCmdletProvider . Para más información sobre cómo implementar estos métodos, consulte Creación de un proveedor de unidades PowerShell para Windows.
Para manipular los elementos de un almacén de datos, como obtener, configurar y compensar elementos, el proveedor debe implementar los métodos proporcionados por la clase base System.Management.Automation.Provider.ItemCmdletProvider . Para más información sobre cómo implementar estos métodos, consulte Creación de un proveedor de elementos para Windows PowerShell.
Para acceder a los elementos hijos, o sus nombres, del almacén de datos, así como a los métodos que crean, copian, renombran y eliminan elementos, debes implementar los métodos proporcionados por la clase base System.Management.Automation.Provider.ContainerCmdletProvider . Para más información sobre cómo implementar estos métodos, consulte Creación de un proveedor de contenedores para Windows PowerShell.
Creación de una ruta PowerShell para Windows
El proveedor de navegación Windows PowerShell utiliza una ruta interna de Windows PowerShell para navegar por los elementos del almacén de datos. Para crear una ruta interna al proveedor, el proveedor debe implementar el método System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* para soportar llamadas desde el cmdlet Combine-Path. Este método combina una ruta padre e hija en una ruta interna del proveedor, utilizando un separador de rutas específico del proveedor entre las rutas padre e hija.
La implementación predeterminada toma caminos con "/" o "\" como separador de caminos, normaliza el separador de caminos a "\", combina las partes padre e hijo con el separador entre ellas, y luego devuelve una cadena que contiene los caminos combinados.
Este proveedor de navegación no implementa este método. Sin embargo, el siguiente código es la implementación predeterminada del método System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* .
Cosas a recordar sobre la implementación de MakePath
Las siguientes condiciones pueden aplicarse a tu implementación de System.Management.Automation.Provider.NavigationCmdletProvider.MakePath*:
Tu implementación del método System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* no debería validar la ruta como una ruta legal y totalmente cualificada en el espacio de nombres del proveedor. Ten en cuenta que cada parámetro solo puede representar una parte de un camino, y las partes combinadas pueden no generar un camino completamente cualificado. Por ejemplo, el método System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* para el proveedor del Sistema de Archivos podría recibir "windows\system32" en el
parentparámetro y "abc.dll" en elchildparámetro. El método une estos valores con el separador "\" y devuelve "windows\system32\abc.dll", que no es una ruta de sistema de archivos completamente cualificada.Importante
Las partes de ruta proporcionadas en la llamada a System.Management.Automation.Provider.NavigationCmdletProvider.MakePath* pueden contener caracteres no permitidos en el espacio de nombres del proveedor. Lo más probable es que estos caracteres se utilicen para la expansión de comodines y la implementación de este método no debería eliminarlos.
Recuperación de la Ruta Principal
Los proveedores de navegación de Windows PowerShell implementan el método System.Management.Automation.Provider.NavigationCmdletProvider.GetParentPath* para recuperar la parte principal de la ruta específica del proveedor total o parcial indicada. El método elimina la parte hija del camino y devuelve la parte del camino padre. El root parámetro especifica el camino completamente cualificado hacia la raíz de una unidad. Este parámetro puede ser nulo o vacío si no se utiliza un disco montado para la operación de recuperación. Si se especifica una raíz, el método debe devolver un camino a un contenedor en el mismo árbol que la raíz.
El proveedor de navegación de ejemplo no anula este método, sino que utiliza la implementación predeterminada. Acepta caminos que usan tanto "/" como "\" como separadores de camino. Primero normaliza el camino para que solo tenga separadores "\", luego separa el camino padre en el último "\" y devuelve el camino padre.
Para recordar la implementación de GetParentPath
Tu implementación del método System.Management.Automation.Provider.NavigationCmdletProvider.GetParentPath* debería separar el camino léxicamente en el separador de rutas para el espacio de nombres del proveedor. Por ejemplo, el proveedor del Sistema de Archivos utiliza este método para buscar el último "\" y devuelve todo a la izquierda del separador.
Recuperar el nombre de la ruta hija
Tu proveedor de navegación implementa el método System.Management.Automation.Provider.NavigationCmdletProvider.GetChildName* para recuperar el nombre (elemento hoja) del hijo del elemento ubicado en la ruta específica del proveedor total o parcial indicada.
El proveedor de navegación de ejemplo no anula este método. La implementación predeterminada se muestra a continuación. Acepta caminos que usan tanto "/" como "\" como separadores de camino. Primero normaliza el camino para que solo tenga separadores "\", luego separa el camino padre en el último "\" y devuelve el nombre de la parte del camino hijo.
Cosas a recordar sobre la implementación de GetChildName
Tu implementación del método System.Management.Automation.Provider.NavigationCmdletProvider.GetChildName* debería separar el camino léxicamente en el separador de caminos. Si el camino suministrado no contiene separadores de camino, el método debería devolver el camino sin modificar.
Importante
La ruta proporcionada en la llamada a este método podría contener caracteres que son ilegales en el espacio de nombres del proveedor. Lo más probable es que estos caracteres se utilicen para la expansión de comodines o para emparejamiento de expresiones regulares, y la implementación de este método no debería eliminarlos.
Determinar si un objeto es un contenedor
El proveedor de navegación puede implementar el método System.Management.Automation.Provider.NavigationCmdletProvider.IsItemContainer* para determinar si la ruta especificada indica un contenedor. Devuelve true si el camino representa un contenedor, y false en caso contrario. El usuario necesita este método para poder usar el Test-Path cmdlet para la ruta suministrada.
El siguiente código muestra la implementación System.Management.Automation.Provider.NavigationCmdletProvider.IsItemContainer* en nuestro proveedor de navegación de ejemplo. El método verifica que el camino especificado es correcto y si la tabla existe, y devuelve true si el camino indica un contenedor.
protected override bool IsItemContainer(string path)
{
if (PathIsDrive(path))
{
return true;
}
string[] pathChunks = ChunkPath(path);
string tableName;
int rowNumber;
PathType type = GetNamesFromPath(path, out tableName, out rowNumber);
if (type == PathType.Table)
{
foreach (DatabaseTableInfo ti in GetTables())
{
if (string.Equals(ti.Name, tableName, StringComparison.OrdinalIgnoreCase))
{
return true;
}
} // foreach (DatabaseTableInfo...
} // if (pathChunks...
return false;
} // IsItemContainer
Cosas a recordar sobre la implementación de IsItemContainer
Tu clase .NET de proveedor de navegación podría declarar capacidades de proveedor de ExpandWildcards, Filtrar, Incluir o Excluir, de la enumeración System.Management.Automation.Provider.ProviderCapabilities . En este caso, la implementación de System.Management.Automation.Provider.NavigationCmdletProvider.IsItemContainer* debe garantizar que la ruta pasada cumpla con los requisitos. Para ello, el método debe acceder a la propiedad correspondiente, por ejemplo, la propiedad System.Management.Automation.Provider.CmdletProvider.Exclude* .
Moviendo un objeto
Para apoyar el Move-Item cmdlet, tu proveedor de navegación implementa el método System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* . Este método mueve el elemento especificado por el path parámetro al contenedor en la ruta proporcionada en el destination parámetro.
El proveedor de navegación de ejemplo no anula el método System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* . La siguiente es la implementación predeterminada.
Cosas a recordar sobre la implementación de MoveItem
Tu clase .NET de proveedor de navegación podría declarar capacidades de proveedor de ExpandWildcards, Filtrar, Incluir o Excluir, de la enumeración System.Management.Automation.Provider.ProviderCapabilities . En este caso, la implementación de System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* debe garantizar que la ruta pasada cumpla con los requisitos. Para ello, el método debe acceder a la propiedad correspondiente, por ejemplo, el CmdletProvider.Excluir la propiedad.
Por defecto, las sobrescrituras de este método no deberían mover objetos sobre objetos existentes a menos que la propiedad System.Management.Automation.Provider.CmdletProvider.Force* esté establecida en true. Por ejemplo, el proveedor del Sistema de Archivos no copiará C:\temp\abc.txt sobre un archivo de C:\bar.txt existente a menos que la propiedad System.Management.Automation.Provider.CmdletProvider.Force* esté configurada en true. Si la ruta especificada en el destination parámetro existe y es un contenedor, la propiedad System.Management.Automation.Provider.CmdletProvider.Force* no es necesaria. En este caso, System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* debe mover el elemento indicado por el path parámetro al contenedor indicado por el destination parámetro como hijo.
Tu implementación del método System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* debe llamar a System.Management.Automation.Provider.CmdletProvider.ShouldProcess y comprobar su valor de retorno antes de realizar cualquier cambio en el almacén de datos. Este método se utiliza para confirmar la ejecución de una operación cuando se realiza un cambio en el estado del sistema, por ejemplo, la eliminación de archivos. System.Management.Automation.Provider.CmdletProvider.ShouldProcess envía el nombre del recurso a cambiar al usuario, teniendo en cuenta el entorno de ejecución de Windows PowerShell cualquier configuración de línea de comandos o variable de preferencia para determinar qué debe mostrarse al usuario.
Tras la llamada a System.Management.Automation.Provider.CmdletProvider.ShouldProcess , trueel método System.Management.Automation.Provider.NavigationCmdletProvider.MoveItem* debe llamar al método System.Management.Automation.Provider.CmdletProvider.ShouldContinue . Este método envía un mensaje al usuario para permitir retroalimentación que indique si la operación debe continuar. Tu proveedor debe llamar a System.Management.Automation.Provider.CmdletProvider.ShouldContinue como comprobación adicional para posibles modificaciones peligrosas del sistema.
Adjuntar parámetros dinámicos al Move-Item cmdlet
A veces el Move-Item cmdlet requiere parámetros adicionales que se proporcionan dinámicamente en tiempo de ejecución. Para proporcionar estos parámetros dinámicos, el proveedor de navegación debe implementar el método System.Management.Automation.Provider.NavigationCmdletProvider.MoveItemDynamicParameters* para obtener los valores de parámetros requeridos del elemento en la ruta indicada, y devolver un objeto que tenga propiedades y campos con atributos de análisis similar a una clase cmdlet o un objeto System.Management.Automation.RuntimeDefinedParameterDictionary .
Este proveedor de navegación no implementa este método. Sin embargo, el siguiente código es la implementación predeterminada de System.Management.Automation.Provider.NavigationCmdletProvider.MoveItemDynamicParameters*.
Normalización de un camino relativo
Tu proveedor de navegación implementa el método System.Management.Automation.Provider.NavigationCmdletProvider.NormalizeRelativePath* para normalizar la ruta totalmente cualificada indicada en el path parámetro como relativa a la ruta especificada por el basePath parámetro. El método devuelve una representación de cadena del camino normalizado. Escribe un error si el path parámetro especifica un camino inexistente.
El proveedor de navegación de ejemplo no anula este método. La siguiente es la implementación predeterminada.
Cosas a recordar sobre la implementación de NormalizeRelativePath
Tu implementación de System.Management.Automation.Provider.NavigationCmdletProvider.NormalizeRelativePath* debería analizar el path parámetro, pero no tiene que usar un análisis sintáctico puro. Se recomienda diseñar este método para usar el camino y buscar la información del camino en el almacén de datos y crear un camino que coincida con la sintaxis del caricia y el camino estandarizado.
Ejemplo de código
Para un código de ejemplo completo, véase AccessDbProviderSample05 Code Sample.
Definición de tipos de objetos y formato
Es posible que un proveedor añada miembros a objetos existentes o defina nuevos objetos. Para más información,véase Extensión de tipos de objetos y formato.
Construcción del proveedor PowerShell de Windows
Para más información, consulte Cómo registrar comandantes, proveedores y aplicaciones anfitrionas.
Probando el proveedor PowerShell de Windows
Cuando tu proveedor de Windows PowerShell esté registrado en Windows PowerShell, puedes probarlo ejecutando los cmdlets compatibles en la línea de comandos, incluyendo los cmdlets disponibles por derivación. Este ejemplo pondrá a prueba el proveedor de navegación de muestras.
Ejecuta tu nuevo shell y usa el
Set-Locationcmdlet para establecer la ruta que indique la base de datos de Access.Set-Location mydb:Ahora ejecuta el
Get-ChildItemcmdlet para recuperar una lista de los elementos de la base de datos, que son las tablas disponibles de la base de datos. Para cada tabla, este cmdlet también recupera el número de filas de la tabla.Get-ChildItem | Format-Table RowCount, Name -AutoSizeRowCount Name -------- ---- 180 MSysAccessObjects 0 MSysACEs 1 MSysCmdbars 0 MSysIMEXColumns 0 MSysIMEXSpecs 0 MSysObjects 0 MSysQueries 7 MSysRelationships 8 Categories 91 Customers 9 Employees 2155 Order Details 830 Orders 77 Products 3 Shippers 29 SuppliersUsa el
Set-Locationcmdlet de nuevo para establecer la ubicación de la tabla de datos de empleados.Set-Location EmployeesAhora usemos el
Get-Locationcmdlet para recuperar el camino hacia la tabla de empleados.Get-LocationPath ---- mydb:\EmployeesAhora usa el
Get-ChildItemcmdlet conectado alFormat-Tablecmdlet. Este conjunto de cmdlets recupera los elementos para la tabla de datos de Empleados, que son las filas de la tabla. Están formateados según lo especificado por elFormat-Tablecmdlet.Get-ChildItem | Format-Table RowNumber, PSIsContainer, Data -AutoSizeRowNumber PSIsContainer Data --------- -------------- ---- 0 False System.Data.DataRow 1 False System.Data.DataRow 2 False System.Data.DataRow 3 False System.Data.DataRow 4 False System.Data.DataRow 5 False System.Data.DataRow 6 False System.Data.DataRow 7 False System.Data.DataRow 8 False System.Data.DataRowAhora puedes ejecutar el
Get-Itemcmdlet para recuperar los elementos de la fila 0 de la tabla de datos de Empleados.Get-Item 0PSPath : AccessDB::C:\PS\Northwind.mdb\Employees\0 PSParentPath : AccessDB::C:\PS\Northwind.mdb\Employees PSChildName : 0 PSDrive : mydb PSProvider : System.Management.Automation.ProviderInfo PSIsContainer : False Data : System.Data.DataRow RowNumber : 0Usa de nuevo el
Get-Itemcmdlet para recuperar los datos del empleado de los elementos de la fila 0.(Get-Item 0).DataEmployeeID : 1 LastName : Davis FirstName : Sara Title : Sales Representative TitleOfCourtesy : Ms. BirthDate : 12/8/1968 12:00:00 AM HireDate : 5/1/1992 12:00:00 AM Address : 4567 Main Street Apt. 2A City : Buffalo Region : NY PostalCode : 98052 Country : USA HomePhone : (206) 555-9857 Extension : 5467 Photo : EmpID1.bmp Notes : Education includes a BA in psychology from Colorado State University. She also completed "The Art of the Cold Call." Nancy is a member of Toastmasters International. ReportsTo : 2
Véase también
Creación de proveedores PowerShell para Windows
Diseña tu proveedor PowerShell para Windows
Ampliación de los tipos de objetos y formato
Implementar un proveedor de PowerShell para contenedores de Windows
Cómo registrar comandantes, proveedores y aplicaciones anfitrionas