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 任何管理员一本书的作者。 此外,Jones 还提供公开和现场 Windows PowerShell 培训。 与他联系通过他的网站 ConcentratedTech.com,或 bit.ly/AskDon

相关内容