Powershell MySQL 将多个返回行插入数据库
Powershell to MySQL insert multiple returned rows into database
我有一个用于登录发现的 powershell 脚本。一个班轮是:
$events = get-eventlog -log system -computername '.' |
where-object {(($_.EventID -like "*7001*") -or ($_.EventID -like "*7002*"))} |
select-object replacementstrings, machinename, timegenerated
这个 returns 'remote computer' 登录详细信息,我需要在另一个 table 中执行 SID 查找。问题是我无法让 MySQL 插入语句循环遍历结果。它将从上面的 $events 变量中插入 1 行。当我在循环中回显 $events 时,它会像您假设的那样遍历返回的结果......我到处寻找谈论使用 powershell 插入多行的人,但在我的搜索中发现 (0) 结果。我目前正在为 mySQL 使用 .net 连接器,如果可能的话,我想使它工作以避免学习的痛苦,但我几乎认为是时候尝试一些新的东西了。下面是我的代码 - 减去凭证变量:
# MySQL Connection string #
function Connect-MySQL([string]$user,[string]$pass,[string]$MySQLHost, [string]$database) {
# Load MySQL .NET Connector Objects
[void] [system.reflection.Assembly]::LoadWithPartialName("MySql.Data")
$connStr = "server=" + $MySQLHost + ";port=3306;uid=" + $user + ";pwd=" + $pass + ";database="+$database+";Pooling=FALSE"
$conn = New-Object MySql.Data.MySqlClient.MySqlConnection($connStr)
$conn.Open()
return $conn
}
# Close Conn
function Disconnect-MySQL($conn) {
$conn.Close()
}
# MySQL Connection Vars #
$user = ''
$pass = ''
$database = ''
$MySQLHost = ''
$conn = Connect-MySQL $user $pass $MySQLHost $database
function Execute-MySQLNonQuery($conn, [string]$query) {
$command = $conn.CreateCommand()
$command.CommandText = $query
$RowsInserted = $command.ExecuteNonQuery()
$command.Dispose()
if ($RowsInserted) {
return $RowInserted
} else {
return $false
}
}
foreach($event in $events){
$sid = $event.replacementstrings[1]
$time = $event.timegenerated
$id = $event.machinename
$query = "INSERT INTO info.ewarp_testing (data1,data2,data3) VALUES ('$sid', '$time','$id')"
$Rows = Execute-MySQLNonQuery $conn $query
}
我问过周围但没有得到任何关于这个问题的答案。当然,我不能是唯一一个需要将 powershell 的整个输出插入 mysql 数据库的人? :) 谢谢!
试试这个。我通过更改 $conn
变量的范围并将 Get-EventLog
替换为 Get-WinEvent
来加快一点速度。我 相信 你的问题是 $command.Dispose()
行,但我现在无法测试它。试一试。
如果这不起作用,您可能需要通过在每个字符串前附加 [string]
来研究将 $side
、$time
和 $Id
转换为字符串。
# MySQL Connection string #
function Connect-MySQL([string]$user, [string]$pass, [string]$MySQLHost, [string]$database)
{
# Load MySQL .NET Connector Objects
[void][system.reflection.Assembly]::LoadWithPartialName("MySql.Data")
$connStr = "server=" + $MySQLHost + ";port=3306;uid=" + $user + ";pwd=" + $pass + ";database=" + $database + ";Pooling=FALSE"
$conn = New-Object MySql.Data.MySqlClient.MySqlConnection($connStr)
$conn.Open()
return $conn
}
# Close Conn
function Disconnect-MySQL()
{
$conn.Close()
}
# MySQL Connection Vars #
$user = ''
$pass = ''
$database = ''
$MySQLHost = ''
$script:conn = Connect-MySQL $user $pass $MySQLHost $database
function Execute-MySQLNonQuery([string]$query)
{
$command = $conn.CreateCommand()
$command.CommandText = $query
$RowsInserted = $command.ExecuteNonQuery()
if ($RowsInserted)
{
return $RowInserted
}
else
{
return $false
}
}
$events = Get-WinEvent -FilterHashtable @{ LogName = 'System'; ID = 7001, 7002 } | select replacementstrings, machinename, timegenerated
foreach ($event in $events)
{
$sid = $event.replacementstrings[1]
$time = $event.timegenerated
$id = $event.machinename
$query = "INSERT INTO info.ewarp_testing (data1,data2,data3) VALUES ('$sid','$time','$id')"
$Rows = Execute-MySQLNonQuery $query
}
只是为了让大家知道 - 我没有为此找到 .NET 解决方案。我们在服务器上对 600 个 powershell 实例进行多线程处理,所以我想这个问题的范围有点大。我最终从 powershell 中删除了一个 csv 文件,并在文件名中传递了一个主机名 var。然后我调用了一个 python 脚本来使用 csv 并输入到 mysql 中,然后删除文件。事实证明,这比尝试使用 .NET 容易得多 - 至少对我而言......干杯。
我有一个用于登录发现的 powershell 脚本。一个班轮是:
$events = get-eventlog -log system -computername '.' |
where-object {(($_.EventID -like "*7001*") -or ($_.EventID -like "*7002*"))} |
select-object replacementstrings, machinename, timegenerated
这个 returns 'remote computer' 登录详细信息,我需要在另一个 table 中执行 SID 查找。问题是我无法让 MySQL 插入语句循环遍历结果。它将从上面的 $events 变量中插入 1 行。当我在循环中回显 $events 时,它会像您假设的那样遍历返回的结果......我到处寻找谈论使用 powershell 插入多行的人,但在我的搜索中发现 (0) 结果。我目前正在为 mySQL 使用 .net 连接器,如果可能的话,我想使它工作以避免学习的痛苦,但我几乎认为是时候尝试一些新的东西了。下面是我的代码 - 减去凭证变量:
# MySQL Connection string #
function Connect-MySQL([string]$user,[string]$pass,[string]$MySQLHost, [string]$database) {
# Load MySQL .NET Connector Objects
[void] [system.reflection.Assembly]::LoadWithPartialName("MySql.Data")
$connStr = "server=" + $MySQLHost + ";port=3306;uid=" + $user + ";pwd=" + $pass + ";database="+$database+";Pooling=FALSE"
$conn = New-Object MySql.Data.MySqlClient.MySqlConnection($connStr)
$conn.Open()
return $conn
}
# Close Conn
function Disconnect-MySQL($conn) {
$conn.Close()
}
# MySQL Connection Vars #
$user = ''
$pass = ''
$database = ''
$MySQLHost = ''
$conn = Connect-MySQL $user $pass $MySQLHost $database
function Execute-MySQLNonQuery($conn, [string]$query) {
$command = $conn.CreateCommand()
$command.CommandText = $query
$RowsInserted = $command.ExecuteNonQuery()
$command.Dispose()
if ($RowsInserted) {
return $RowInserted
} else {
return $false
}
}
foreach($event in $events){
$sid = $event.replacementstrings[1]
$time = $event.timegenerated
$id = $event.machinename
$query = "INSERT INTO info.ewarp_testing (data1,data2,data3) VALUES ('$sid', '$time','$id')"
$Rows = Execute-MySQLNonQuery $conn $query
}
我问过周围但没有得到任何关于这个问题的答案。当然,我不能是唯一一个需要将 powershell 的整个输出插入 mysql 数据库的人? :) 谢谢!
试试这个。我通过更改 $conn
变量的范围并将 Get-EventLog
替换为 Get-WinEvent
来加快一点速度。我 相信 你的问题是 $command.Dispose()
行,但我现在无法测试它。试一试。
如果这不起作用,您可能需要通过在每个字符串前附加 [string]
来研究将 $side
、$time
和 $Id
转换为字符串。
# MySQL Connection string #
function Connect-MySQL([string]$user, [string]$pass, [string]$MySQLHost, [string]$database)
{
# Load MySQL .NET Connector Objects
[void][system.reflection.Assembly]::LoadWithPartialName("MySql.Data")
$connStr = "server=" + $MySQLHost + ";port=3306;uid=" + $user + ";pwd=" + $pass + ";database=" + $database + ";Pooling=FALSE"
$conn = New-Object MySql.Data.MySqlClient.MySqlConnection($connStr)
$conn.Open()
return $conn
}
# Close Conn
function Disconnect-MySQL()
{
$conn.Close()
}
# MySQL Connection Vars #
$user = ''
$pass = ''
$database = ''
$MySQLHost = ''
$script:conn = Connect-MySQL $user $pass $MySQLHost $database
function Execute-MySQLNonQuery([string]$query)
{
$command = $conn.CreateCommand()
$command.CommandText = $query
$RowsInserted = $command.ExecuteNonQuery()
if ($RowsInserted)
{
return $RowInserted
}
else
{
return $false
}
}
$events = Get-WinEvent -FilterHashtable @{ LogName = 'System'; ID = 7001, 7002 } | select replacementstrings, machinename, timegenerated
foreach ($event in $events)
{
$sid = $event.replacementstrings[1]
$time = $event.timegenerated
$id = $event.machinename
$query = "INSERT INTO info.ewarp_testing (data1,data2,data3) VALUES ('$sid','$time','$id')"
$Rows = Execute-MySQLNonQuery $query
}
只是为了让大家知道 - 我没有为此找到 .NET 解决方案。我们在服务器上对 600 个 powershell 实例进行多线程处理,所以我想这个问题的范围有点大。我最终从 powershell 中删除了一个 csv 文件,并在文件名中传递了一个主机名 var。然后我调用了一个 python 脚本来使用 csv 并输入到 mysql 中,然后删除文件。事实证明,这比尝试使用 .NET 容易得多 - 至少对我而言......干杯。