Compartir a través de


Windows PowerShell: ¿Por qué no podemos todos trabajamos juntos?

Puede configurar Windows PowerShell para utilizar los datos almacenados en una base de datos SQL Server. Aquí es cómo.

Don Jones

Una pregunta que me pregunta todo el tiempo es cómo hacer que Windows PowerShell utilizar datos de una base de datos, como una base de datos SQL Server alojado. De hecho, esa pregunta viene con tanta frecuencia que decidí escribir un capítulo sobre sólo cómo hacerlo para mi auto-publicado "Windows PowerShell Scripting y herramientas" (lulu.com, 2011).

Mi solución era crear dos funciones: una para consultar datos y otro para cambiar datos (Insertar, eliminar y actualizar las tareas). De este modo, la funcionalidad es independiente y se puede reutilizar fácilmente entre proyectos. Debido a que las capacidades de base de datos son incorporadas en Microsoft.NET Framework, no necesita instalar nada más allá de estos Windows PowerShell para trabajar.

Funciones de base de datos

Para realizar estas funciones fáciles de usar, guardarlos como un módulo. Por ejemplo, he guardado minas en \MyDocuments\WindowsPowerShell\Modules\DataTools\DataTools.psm1.

Asegúrese de que guardar esto en Mis documentos, no compartida. De este modo Windows PowerShell puede encontrarlo correctamente. A continuación, cargar el archivo, simplemente ejecute DataTools módulo de importación (véase figura 1).

Figura 1 Guardar y ejecutar esta función como un módulo facilita encontrar.

function Get-DatabaseData { [CmdletBinding()] param ( [string]$connectionString, [string]$query, [switch]$isSQLServer ) if ($isSQLServer) { Write-Verbose 'in SQL Server mode' $connection = New-Object-TypeName System.Data.SqlClient.SqlConnection } else { Write-Verbose 'in OleDB mode' $connection = New-Object-TypeName System.Data.OleDb.OleDbConnection } $connection.ConnectionString = $connectionString $command = $connection.CreateCommand() $command.CommandText = $query if ($isSQLServer) { $adapter = New-Object-TypeName System.Data.SqlClient.SqlDataAdapter $command } else { $adapter = New-Object-TypeName System.Data.OleDb.OleDbDataAdapter $command } $dataset = New-Object-TypeName System.Data.DataSet $adapter.Fill($dataset) $dataset.Tables[0] } function Invoke-DatabaseQuery { [CmdletBinding()] param ( [string]$connectionString, [string]$query, [switch]$isSQLServer ) if ($isSQLServer) { Write-Verbose 'in SQL Server mode' $connection = New-Object-TypeName System.Data.SqlClient.SqlConnection } else { Write-Verbose 'in OleDB mode' $connection = New-Object-TypeName System.Data.OleDb.OleDbConnection } $connection.ConnectionString = $connectionString $command = $connection.CreateCommand() $command.CommandText = $query $connection.Open() $command.ExecuteNonQuery() $connection.close() }

Para utilizar estos, simplemente llame Get-DatabaseData o los comandos de Invoke-DatabaseQuery. Cada uno de esos comandos tiene un parámetro de –isSQLServer que tienes que utilizar al consultar un servidor SQL Server. De lo contrario, Windows PowerShell asumirá que utiliza una fuente de SQL Server OleDB. También debe proporcionar un parámetro de –connectionString y un –query.

Por ejemplo, para eliminar todos los datos en una tabla denominada MyTable en una base de datos denominada MyDatabase en una máquina de SQL Server denominada Server1, utilizando una instancia de SQL Server no predeterminada llamada SQLEXPRESS, podría ejecutar el siguiente comando (nota que estoy proporcionando un inicio de sesión SQL Server-estilo y una contraseña, en lugar de un inicio de sesión integrado):

Invoke-DatabaseQuery –query "DELETE FROM MyTable" –isSQLServer –connectionString "Data Source=SERVER1\SQLEXPRESS;Initial Catalog=MyDatabase;User Id=myLogin;Password=P@ssw0rd"

Aquí es una sugerencia: Nunca puedo recordar la sintaxis de cadena de conexión. Incluso no intentes. Sólo voy a connectionstrings.com y buscar el ejemplo necesito.

El comando DatabaseQuery Invoke no produce ningún resultado. El comando Get-DatabaseData hace. Específicamente, se le devolverá un objeto DataTable. Es esencialmente una colección de objetos donde cada objeto es una fila de resultados de la consulta. Las propiedades de cada objeto se corresponden con las columnas de los resultados de la consulta.

Pruebas, pruebas

Vamos a ejecutar a través de un ensayo completo. Utilice la libre SQL Server Express Edition, que se instala a una instancia con nombre llamada SQLEXPRESS. He descargado e instalado la versión que incluye la herramienta Express Management Studio. Esta todo sucedió en mi equipo local. Va depender de la autenticación de Windows para este ejemplo, en lugar de la autenticación de SQL Server.

Abro Management Studio y conectarse a la instancia localhost\SQLEXPRESS (fue iniciado sesión como administrador y acaba de utilizar esa credencial para acceder al servidor de base de datos). Abrir una nueva ventana de consulta y ejecutar el la consulta mostrada en la figura 2 para crear una base de datos de ejemplo.

La figura 2. Crear una base de datos de ejemplo.

CREATE DATABASE [Inventory] ON PRIMARY ( NAME = N'Inventory', FILENAME = N'c:\Program Files\Microsoft SQL Server\MSSQL10_50.SQLEXPRESS\MSSQL\DATA\Inventory.mdf' , SIZE = 2048KB , FILEGROWTH = 1024KB ) LOG ON ( NAME = N'Inventory_log', FILENAME = N'c:\Program Files\Microsoft SQL Server\MSSQL10_50.SQLEXPRESS\MSSQL\DATA\Inventory_log.ldf' , SIZE = 1024KB , FILEGROWTH = 10%) GO USE [Inventory] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[Computers]( [computer] [nvarchar](50) NULL, [osversion] [nvarchar](100) NULL, [biosserial] [nvarchar](100) NULL, [osarchitecture] [nvarchar](5) NULL, [procarchitecture] [nvarchar](5) NULL ) ON [PRIMARY] GO

A continuación, eliminar la consulta mostrada en figura 2 desde la ventana de consulta y ejecutar la siguiente consulta:

Use [Inventory] Go INSERT INTO Computers (computer) VALUES ('localhost') INSERT INTO Computers (computer) VALUES ('localhost') INSERT INTO Computers (computer) VALUES ('not-online')

Agrega tres filas de datos a la tabla. A continuación, cambiar a Windows PowerShell. Después de importar el módulo de DataTools a mi concha, ejecutar los siguientes comandos:

Get-DatabaseData -verbose -connectionString 'Server=localhost\SQLEXPRESS;Database=Inventory;Trusted_Connection=True;' -isSQLServer-query "SELECT * FROM Computers" Invoke-DatabaseQuery -verbose -connectionString 'Server=localhost\SQLEXPRESS;Database=Inventory;Trusted_Connection=True;' -isSQLServer-query "INSERT INTO Computers (computer) VALUES('win7')" Get-DatabaseData -verbose -connectionString 'Server=localhost\SQLEXPRESS;Database=Inventory;Trusted_Connection=True;' -isSQLServer-query "SELECT * FROM Computers"

Esto confirma la tabla se rellena inicialmente con tres equipos, y otro había agregado correctamente.

Bases de datos de fácil

Poner el trabajo a hacer estas dos funciones me ahorra mucho tiempo. Siempre tengo que leer o escribir en cualquier base de datos, sólo de importación mi módulo y está listo para ir.

No tienes que almacenar el módulo en la carpeta específica que he mencionado aquí. Puede guardarlo en cualquier lugar, si estás dispuesto a especificar la ruta completa del archivo .psm1 al ejecutar el módulo de importación. Sin embargo, mediante el uso de esa carpeta específica, puedo sólo importar el módulo por su nombre, sin especificar una ruta de acceso. Esa es ahorro otra de tiempo.

Don Jones

Don Jones es un premio de MVP de Microsoft y autor de "Aprender Windows PowerShell en un mes de comidas" (publicaciones de Manning, 2011), un libro diseñado para ayudar a cualquier administrador efectivizada con Windows PowerShell. Jones también ofrece formación de Windows PowerShell in situ y pública. Contacto con él a través de su sitio Web en ConcentratedTech.com, o bit.ly/AskDon.

Contenido relacionado