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 容易得多 - 至少对我而言......干杯。