Windows PowerShell: Warum können wir alle nur nicht zusammen arbeiten?

Sie können Windows PowerShell so konfigurieren, dass Daten verwendet werden, die in einer SQL Server-Datenbank gespeichert sind. Hier ist wie.

Don Jones

Eine Frage, die ich ständig gefragt werde, ist, wie Windows PowerShell verwenden, Daten aus einer Datenbank, z. B. eine SQL Server gehosteten Datenbank haben. In der Tat, diese Frage kommt so häufig, dass ich beschloss, ein Kapitel schreiben bei wie zu ausführen dieses als mein Selbstverlag "Windows PowerShell Scripting und Werkzeugbau" (lulu.com, 2011).

Meine Lösung bestand darin, zwei Funktionen erstellen – eine für das Abfragen von Daten und eine andere für das Ändern von Daten (einfügen, löschen und Aktualisieren von Vorgängen). Auf diese Weise die Funktionalität ist in sich abgeschlossen und Sie können es leicht zwischen Projekten wiederverwenden. Da Datenbank-Funktionen in Microsoft integriert sind.NET Framework, Sie brauchen nicht zu beisetzen etwas über Windows PowerShell selbst für diese Arbeit.

Datenbank-Funktionen

Um diese Funktionen einfacher zu verwenden, speichern Sie sie als ein Modul. Zum Beispiel, ich meine in \MyDocuments\WindowsPowerShell\Modules\DataTools\DataTools.psm1 gespeichert.

Stellen Sie sicher, dass Sie dies auf eigene Dateien, nicht freigegebene Dokumente speichern. Auf diese Weise Windows PowerShell finden es richtig. Dann, um die Datei zu laden, nur laufen Import-Module DataTools (siehe Abbildung 1).

Abbildung 1 speichern und diese Funktion ausführen, wie ein Modul es leichter macht zu finden.

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

Um diese zu verwenden, rufen Sie die Get-DatabaseData oder die Invoke-DatabaseQuery-Befehle. Jeder dieser Befehle hat einen –isSQLServer-Parameter, die Sie verwenden, wenn ein SQL-Server Abfragen. Andernfalls, wird Windows PowerShell davon aus, dass Sie eine nicht - SQL Server OleDB-Datenquelle verwenden. Sie müssen auch einen –connectionString-Parameter und einen – Query-Parameter angeben.

Beispielsweise würde löschen Sie alle Daten in einer Tabelle namens MyTable in einer Datenbank mit dem Namen MyDatabase auf eine SQL Server-Computer mit dem Namen Server1, verwenden eine SQL Server nicht-Standardinstanz mit dem Namen SQLEXPRESS, ich ausführen den folgenden Befehl (Beachten Sie, dass ich einer SQL Server-Stil Login und Passwort, statt ein integriertes Login bereitstellen bin):

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

Hier ist ein Tipp: Ich kann nie mich erinnern die Syntax die Verbindungszeichenfolge. Ich noch nicht einmal versuchen. Ich gehe nur in connectionstrings.com und suchen Sie das Beispiel, das ich brauche.

Der Invoke-DatabaseQuery-Befehl erzeugen keine Ausgabe. Der Befehl führt Get-DatabaseData. Insbesondere wird eine DataTable zurückgegeben. Das ist im Wesentlichen eine Sammlung von Objekten, jedes Objekt eine Zeile aus den Abfrageergebnissen. Jedes Objekt Eigenschaften entsprechen den Spalten der Abfrageergebnisse.

Tests, Tests

Lassen Sie uns einen vollständigen Test durchlaufen. Verwenden Sie die kostenlose SQL Server Express Edition, die sich zu einer benannten Instanz namens SQLEXPRESS installiert. Ich habe heruntergeladen und installiert die Version, die das Tool Express Management Studio enthält. Dieses alles geschah auf dem lokalen Computer. Ich werde auf Windows-Authentifizierung anstelle der SQL Server-Authentifizierung in diesem Beispiel verlassen.

Ich öffnen Sie Management Studio und eine Verbindung zu der Instanz Localhost\SQLEXPRESS (ich als Administrator angemeldet war und gerade verwendet diese Anmeldeinformationen Zugriff auf den Datenbankserver). Ich öffnen Sie ein neues Abfragefenster, und führen Sie die Abfrage zum Erstellen einer Beispieldatenbank in Abbildung 2 dargestellt.

Abbildung 2. Erstellen Sie eine Beispieldatenbank.

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

Als nächstes löschen ich die Abfrage angezeigt, die Abbildung 2 aus dem Abfragefenster und führen Sie die folgende Abfrage:

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

Der Tabelle hinzugefügt, die drei Zeilen mit Daten. Dann schalte ich auf Windows PowerShell. Nach dem Importieren des DataTools Moduls in meinem Schneckenhaus, ausführen ich folgende Befehle:

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"

Dies bestätigt die Tabelle wurde zunächst mit drei Computern aufgefüllt, und ich ein anderes erfolgreich hinzugefügt.

Datenbanken leicht gemacht

Setzen die Arbeit zu machen diese beiden Funktionen spart mir viel Zeit. Wann muss ich zum Lesen oder schreiben in einer beliebigen Datenbank importieren nur mein Modul und es ist bereit zu gehen.

Sie müssen nicht das Modul in einem bestimmten Ordner zu speichern, die ich hier erwähnt. Sie können es überall speichern, wenn Sie bereit sind, den vollständigen Pfad der Datei .psm1 angeben, wenn Import-Module ausgeführt. Allerdings können mit diesen speziellen Ordner, nur das Modul den Namen importieren ohne einen Pfad anzugeben. Das ist ein weiterer Zeitvorteil.

Don Jones

Don Jones ist ein Microsoft MVP Award Empfänger und Autor von "Lernen Sie Windows PowerShell in ein Monat der Mittagessen" (Manning Publications, 2011), ein Buch so konzipiert, dass jeder Administrator mit Windows PowerShell wirksam zu helfen. Jones bietet öffentlichen und vor-Ort-Training an Windows PowerShell. Sie erreichen ihn über seine Website auf ConcentratedTech.com, oder bit.ly/AskDon.

Verwandter Inhalt