powershell将结果记录到DB

时间:2011-12-27 21:58:25

标签: database logging powershell

如何将Powershell命令的结果保存到MS SQL DB?

例如:

我在Powershell提示符下运行:get-psdrive并在列视图中返回一些结果。

如何获取结果的每个元素并将其记录到单独的数据库行/列中?

1 个答案:

答案 0 :(得分:3)

我建议将命令的结果保存到变量中。如:

$drives = Get-PSDrive

变量可以像这样索引:

第一元素:

$drives[0]

最后一个元素:

$drives[-1]

您可以使用foreach迭代每个元素:

foreach ($drive in $drives) {
    # current drive is $drive
}

ForEach-Object cmdlet:

$drives | ForEach-Object {
    # current drive is $_
}

现在您已准备好填充表的数据,您已准备好连接到数据库并执行数据库记录插入。

您可以使用Powershell SQL Server cmdlet,也可以使用.NET对象进行连接。根据您拥有的SQL服务器版本,将驱动您选择使用哪个版本。 SQL Server 2008具有Powershell cmdlet,2005则没有。有关SQL Server 2008 Powershell集成here的大量信息。对于SQL Server 2005,您有一些不同的选项。此问题的答案here提供了一个用于SQL Server 2005的Powershell选项列表。

更多信息:

当Powershell显示对象信息时,它使用类型系统来选择性地确定要在屏幕上显示的对象的属性。并非所有对象都显示出来。 Powershell使用XML文件来确定要显示哪些属性存储在Powershell目录中:

dir $PSHOME/*format* | select Name

Get-PsDrive返回的对象属于System.Management.Automation.PSDriveInfo类型。文件PowerShellCore.format.ps1xml告诉格式化引擎在Powershell窗口中显示哪些属性。它可能是您正在寻找的确切属性,但是许多对象具有未显示的其他属性。例如,类型为System.IO.DirectoryInfo的对象默认情况下不会显示其所有属性。您可以使用Get-Member cmdlet查看其余对象属性,例如:

Get-Item $env:windir | Get-Member

这将显示所有对象的方法和属性。您还可以使用Select-Object cmdlet使用通配符查看属性参数来查看所有对象的属性:

Get-Item $env:windir | Select-Object -Property *

要访问对象属性值,请使用以下语法:

$objectVariable.ObjectProperty

现在您已了解如何查看对象属性并访问其值,您需要使用它来构造Insert SQL语句。以下是使用SQL Server 2008提供的Invoke-SqlCmd cmdlet的示例。

Invoke-Sqlcmd -ServerInstance $env:COMPUTERNAME -Database Test -Query "Insert MyTable values ('a', 'b')"

这是循环通过Get-PsDrive返回的对象的示例,假设您有一个名为MyTable的表,并且它至少有两列接受文本数据:

Get-PsDrive | ForEach-Object {
    $providerName = $_.Name
    $providerRoot = $_.Root
    Invoke-Sqlcmd -ServerInstance $env:COMPUTERNAME -Database Test -Query "Insert MyTable values ('$providerName', '$providerRoot')"
}