Windows PowerShell: Perché non possiamo tutti solo lavoriamo insieme?

È possibile configurare Windows PowerShell per l'utilizzo di dati archiviati in un database SQL Server. Ecco come.

Don Jones

Una domanda che sono chiesto tutto il tempo è come avere Windows PowerShell utilizzare i dati da un database, ad esempio un database di SQL Server ospitati. In realtà, tale questione si presenta così frequentemente che ho deciso di scrivere un capitolo su solo come fare questo per il mio auto-pubblicato "Windows PowerShell Scripting e utensili" (lulu.com, 2011).

La mia soluzione era quella di creare due funzioni — uno per l'interrogazione dei dati e un altro per la modifica dei dati (inserire, eliminare e aggiornare i compiti). In questo modo, la funzionalità è autonoma e può facilmente riutilizzarlo tra i progetti. Poiché la funzionalità di database sono incorporate in Microsoft.NET Framework, non è necessario installare nulla di là di Windows PowerShell stesso per questi a lavorare.

Funzioni di database

Per rendere più facile da usare queste funzioni, salvarli come un modulo. Per esempio, ho salvato miniera nella \MyDocuments\WindowsPowerShell\Modules\DataTools\DataTools.psm1.

Assicurarsi che questo si salva documenti, non i documenti condivisi. In questo modo Windows PowerShell può trovare correttamente. Poi, per caricare il file, basta eseguire Importazione modulo DataTools (vedere Figura 1).

Figura 1 salvando e l'esecuzione di questa funzione come un modulo rende più facile trovare.

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() }

Per utilizzare queste, basta chiamare Get-DatabaseData o i comandi Invoke-DatabaseQuery. Ognuno di quei comandi dispone di un parametro –isSQLServer che devi usare quando l'esecuzione di query su un database SQL Server. Windows PowerShell assumerà in caso contrario, che si sta utilizzando una fonte non SQL Server OleDB. Deve inoltre fornire un parametro –connectionString e un parametro – query.

Ad esempio, per eliminare tutti i dati in una tabella denominata MyTable in un database denominato MyDatabase su una macchina di SQL Server denominata Server1, utilizzando un'istanza di SQL Server non predefinita denominata SQLEXPRESS, sarebbe eseguire il seguente comando (da notare che sto fornendo un tipo SQL Server login e password, invece di un accesso integrato):

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

Ecco un suggerimento: Non riesco mai a ricordare la sintassi della stringa di connessione. Non cercano nemmeno. Basta andare a connectionstrings.com e cercare l'esempio che ho bisogno.

Il comando DatabaseQuery Invoke non produce alcun output. Il comando Get-DatabaseData fa. In particolare, verrà restituito un oggetto DataTable. Questo è essenzialmente un insieme di oggetti dove ogni oggetto è una riga dai risultati delle query. Proprietà di ogni oggetto corrispondono alle colonne dei risultati della query.

Attività di test

Corriamo attraverso un test completo. Utilizzare il libero SQL Server Express Edition, che si installa a un'istanza denominata chiamata SQLEXPRESS. Ho scaricato e installato la versione che include lo strumento di Management Studio Express. Questo tutto è accaduto sul mio computer locale. Ti affidano l'autenticazione di Windows per questo esempio, invece di autenticazione di SQL Server.

Apro il Management Studio e connettersi a un'istanza localhost\SQLEXPRESS (è stato effettuato l'accesso come amministratore e appena usato quelle credenziali per accedere ai server di database). Ho aperto una nuova finestra di query ed eseguire la query illustrata nella figura 2 per creare un database di esempio.

Nella figura 2. Creare un database di esempio.

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

Successivamente, a eliminare la query mostrata in Figura 2 dalla finestra di query ed eseguire la query seguente:

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

Che aggiunge tre righe di dati nella tabella. Quindi passare a Windows PowerShell. Dopo aver importato il modulo DataTools nel mio guscio, eseguire i seguenti comandi:

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"

Questo conferma la tabella è stata inizialmente popolata con tre computer, e ho aggiunto con successo un altro.

Basi di dati ha reso facile

Mettere il lavoro nel rendere queste due funzioni mi fa risparmiare un sacco di tempo. Ogni volta che bisogno di leggere o scrivere qualsiasi database, importa solo mio modulo ed è pronto ad andare.

Non è necessario archiviare il modulo nella cartella specifica che detto qui. È possibile salvarlo ovunque, se siete disposti a specificare il percorso completo del file psm1 durante l'esecuzione di Import-Module. Tuttavia, utilizzando tale cartella specifica, io posso solo importare il modulo con il nome, senza specificare un percorso. Ecco un altro risparmio di tempo.

Don Jones

Don Jones è un Microsoft MVP Award destinatario e autore di "Imparare Windows PowerShell in un mese di pranzi" (Manning Publications, 2011), un libro progettato per aiutare ogni amministratore di diventare effettiva con Windows PowerShell. Jones offre anche la formazione di Windows PowerShell pubblici e in loco. Contattarlo tramite il suo sito Web a ConcentratedTech.com, o bit.ly/AskDon.

Contenuto correlato