共用方式為


**Windows PowerShell:**為什麼不能我們都只是一起合作?

您可以設定 Windows PowerShell 來使用儲存在 SQL Server 資料庫中的資料。 這裡是如何。

Don Jones

所有的時間都有人問我的一個問題是如何有 Windows PowerShell 使用一個資料庫,如 SQL Server 宿主的資料庫中的資料。 事實上,這個問題來了如此頻繁,我決定寫一章有關如何執行此操作的製造我自助出版"Windows PowerShell 腳本和工具"(lulu.com,2011年)。

我的解決方案是創建兩個功能 — — 一個用於查詢資料,另一個用於更改資料 (插入、 刪除和更新任務)。 這樣一來,功能齊全,您可以方便地重用專案之間。 因為資料庫功能內置了微軟。NET 框架,您不需要安裝 Windows PowerShell 本身為這些工作之外的東西。

資料庫函數

要使這些函數更易於使用,請將其保存為一個模組。 例如,我在 \MyDocuments\WindowsPowerShell\Modules\DataTools\DataTools.psm1 中保存礦井。

請確保您保存到我的文件,而不共用文件。 這種方式的 Windows PowerShell 正確可以找到它。 然後,以載入檔,只是運行資料工具導入模組 (請參見圖 1)。

圖 1 保存並運行此函數,如模組使它更易於找到。

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

若要使用這些,只是調用 Get-資料庫資料或調用 DatabaseQuery 命令。 每個這些命令有一個 –isSQLServer 參數,您必須使用 SQL Server 查詢時。 否則,Windows PowerShell 將假定您正在使用非 SQL 伺服器 OleDB 源。 此外,您還必須提供 –connectionString 參數與 –query 參數。

例如,要刪除使用名為 SQLEXPRESS,SQL Server 非預設實例名 MyTable 為 Server1,名為 SQL Server 電腦上名為 MyDatabase 的資料庫中的表中的所有資料我會運行下麵的命令 (請注意我想向 SQL 伺服器風格登錄名和密碼,而不是集成登錄的):

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

這裡是一個提示:我永遠記得的連接字串語法。 我甚至不去嘗試。 我只是去 connectionstrings.com 和查找需要的示例。

調用 DatabaseQuery 命令不會產生任何輸出。 命令獲取資料庫資料執行的操作。 具體來說,它將返回資料表。 這是本質上的每個物件在哪裡查詢結果中的行的物件的集合。 每個物件的屬性對應于您的查詢結果中的列。

測試啊,測試

讓我們通過一個完整的測試運行。 使用免費 SQL Server Express 版,其中自行安裝到名為 SQLEXPRESS 的命名實例。 我已經下載並安裝的版本,其中包括快遞管理工作室工具。 這一切都發生在我的本地電腦上。 我會依賴此示例,而不是 SQL Server 身份驗證的 Windows 身份驗證。

打開管理工作室,並連接到 localhost\SQLEXPRESS 實例 (我作為管理員登錄和只是用於該憑據訪問資料庫伺服器)。 打開一個新的查詢視窗,並運行查詢來創建示例資料庫圖 2 所示。

圖 2。 創建示例資料庫。

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

接下來,我刪除中顯示的查詢圖 2 從查詢視窗並運行以下查詢:

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

這三行資料添加到表中。 然後切換到 Windows PowerShell。 我謹此陳後將資料工具模組導入我的殼,運行以下命令:

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"

這確認表最初填充與三個電腦,並成功將添加另一個。

創建簡單的資料庫

投入工作使這兩個函數將我保存了很多時間。 每當我需要讀取或寫入到任何資料庫,只是導入我的模組和它已做好準備。

你不必在我這裡提到的特定資料夾中存儲模組。 您可以將其保存在任何地方,如果你願意時運行導入模組指定.psm1 檔的完整路徑。 但是,通過使用該特定的資料夾,我可以只是模組通過導入名稱,而不指定路徑。 這是另一種節省時間。

Don Jones

Don Jones 是 Microsoft MVP 獎得主和"學習 Windows PowerShell 中月的午餐 」 (曼甯發佈 2011年),旨在説明成為有效的 Windows PowerShell 任何管理員一本書的作者。 鐘斯還提供公共和現場 Windows PowerShell 培訓。 與他聯繫通過他的網站 ConcentratedTech.com,或 bit.ly/AskDon

相關內容