将Microsoft更新插入数据库

时间:2014-03-03 13:20:24

标签: sql powershell updates

我正在尝试修改this script,以便将已安装的更新插入到SQL Server数据库表中。

$conn = New-Object System.Data.SqlClient.SqlConnection
$conn.ConnectionString = "Data Source=sqlserver; Initial Catalog=updates; Integrated Security=SSPI;"

$conn.Open()

$cmd = New-Object System.Data.SqlClient.SqlCommand 
$cmd.Connection = $conn
$cmd = $conn.CreateCommand()
$wu = new-object -com “Microsoft.Update.Searcher”
$totalupdates = $wu.GetTotalHistoryCount()
$all = $wu.QueryHistory(0,$totalupdates)

$OutputCollection=  @()
Foreach ($update in $all){
 $Regex = “KB\d*”
$KB = $string | Select-String -Pattern $regex | Select-Object { $_.Matches }
$output = New-Object -TypeName PSobject
$output | add-member NoteProperty “HotFix ID” -value $KB.‘ $_.Matches ‘.Value
  $output | add-member NoteProperty “Title” -value $string
$OutputCollection += $output
 $cmd.CommandText += "INSERT INTO dbo.updates (hotfixid, hotfixdescription) VALUES ('$($kb.'$_.Matches'.Value)', ('$($string)'))"
}

$cmd.ExecuteNonQuery()
$conn.close()

目前,我在sql server中获得了正确的更新行数,但它没有显示hotfixid,而在hotfix descriptien列中,所有行中只有一个更新。

谢谢!

1 个答案:

答案 0 :(得分:0)

在循环中执行INSERT。但是,我建议您使用预准备语句,而不是通过字符串连接构建SQL语句。此外,当您不在任何地方使用它时,无需构建$OutputCollection个对象。

这样的事情应该有效:

...
$wu.QueryHistory(0, $totalupdates) | % {
  $KB = $_.Title | ? { $_ -match '(KB\d+)' } | % { $matches[1] }

  $cmd = $conn.CreateCommand()
  $cmd.CommandText = "INSERT INTO dbo.updates (hotfixid, hotfixdescription) " +
                     "VALUES (@id, @descr)"
  $cmd.Parameters.AddWithValue("@id", $KB)
  $cmd.Parameters.AddWithValue("@descr", $_.Title)
  $cmd.Prepare()
  $cmd.ExecuteNonQuery()
}
...

未经测试,因为我手头没有SQL Server。我还怀疑有一种更有效的方法来处理准备好的语句,但我对SQL Server并不熟悉。