首页 > 解决方案 > 索引为 [-1] 的数组

问题描述

我有一个函数给我一些效果Get-WinEvent很好的结果。将它用作另一个函数的输入并尝试迭代我注意到的数组,该数组的构建方式如下:

-1
   ProviderName:Microsoft-Windows-FailoverClustering

TimeCreated Id LevelDisplayName 消息
----------- -- ---------------- --------
07.08.2019 01:14:23 1538 信息 集群配置数据的备份操作成功完成。快照 ID 为“47cda23b-c446-43dc-9b5d-dfdbaca2be8c”。

显然我不想拥有“-1”和“ProviderName:Microsoft-Windows-FailoverClustering”。

如何正确处理?

function Get-ClusterLogEntries {
    Param(
        [Parameter(Position=0, Mandatory=$true)]
        [int] $server_id,
        [Parameter(Position=1, Mandatory=$true)]
        [string] $clusterName
    )

    $conn = New-Object System.Data.SqlClient.SqlConnection
    $conn.ConnectionString = "Server=xxxx\yyyy;Database=zzzz;Integrated Security=True"
    $conn.Open() | Out-Null
    $cmd = New-Object System.Data.SqlClient.SqlCommand("extern.xxxx", $conn)

    $cmd.CommandType = [System.Data.CommandType]::StoredProcedure

    $cmd.Parameters.Add("@server_id", [System.Data.SqlDbType]::int) | Out-Null
    $cmd.Parameters['@server_id'].Direction = [System.Data.ParameterDirection]::Input
    $cmd.Parameters['@server_id'].Value = $server_id #local server

    $cmd.Parameters.Add("@clusterName", [System.Data.SqlDbType]::VarChar, 10) | Out-Null
    $cmd.Parameters['@clusterName'].Direction = [System.Data.ParameterDirection]::Input
    $cmd.Parameters['@clusterName'].Value = $clusterName

    $cmd.Parameters.Add("@timeCreated", [System.Data.SqlDbType]::DateTime) | Out-Null
    $cmd.Parameters['@timeCreated'].Direction = [System.Data.ParameterDirection]::Output

    $cmd.ExecuteNonQuery()
    $conn.Close()
    $conn.Dispose()

    $timeCreated = $cmd.Parameters["@timeCreated"].Value
    $startdatum = $timeCreated
    return [array]$clusterLogEntries = Get-WinEvent -FilterHashTable @{
        logname   = 'Microsoft-Windows-FailoverClustering/Operational';
        starttime = $startdatum
    }
}

和消费功能:

function Write-ClusterLog {
    Param(
        [Parameter(Position=0, Mandatory=$true)]
        [int] $server_id,
        [Parameter(Position=1, Mandatory=$true)]
        [string] $computer,
        [Parameter(Position=2, Mandatory=$true)]
        [string] $clusterName,
        [Parameter(Position=3, Mandatory=$true)]
        [array] $clusterLogs
    )

    $conn = New-Object System.Data.SqlClient.SqlConnection
    $conn.ConnectionString = "Server=xxxx;Database=yyyyy;Integrated Security=True"
    $conn.Open() | Out-Null
    $cmd = New-Object System.Data.SqlClient.SqlCommand("extern.zzzzzz", $conn)

    $cmd.CommandType = [System.Data.CommandType]::StoredProcedure

    foreach ($clusterLog in $clusterLogs) {
        $cmd.Parameters.Add("@server_id", [System.Data.SqlDbType]::int) | Out-Null
        $cmd.Parameters['@server_id'].Direction = [System.Data.ParameterDirection]::Input
        $cmd.Parameters['@server_id'].Value = $server_id

        $cmd.Parameters.Add("@servername", [System.Data.SqlDbType]::VarChar, 10) | Out-Null
        $cmd.Parameters['@servername'].Direction = [System.Data.ParameterDirection]::Input
        $cmd.Parameters['@servername'].Value = $computer #local server

        $cmd.Parameters.Add("@clustername", [System.Data.SqlDbType]::VarChar, 10) | Out-Null
        $cmd.Parameters['@clustername'].Direction = [System.Data.ParameterDirection]::Input
        $cmd.Parameters['@clustername'].Value = $clusterName

        $cmd.Parameters.Add("@timecreated", [System.Data.SqlDbType]::DateTime) | Out-Null
        $cmd.Parameters['@timecreated'].Direction = [System.Data.ParameterDirection]::Input
        $cmd.Parameters['@timecreated'].Value = $clusterLog.TimeCreated

        $cmd.Parameters.Add("@eventID", [System.Data.SqlDbType]::int) | Out-Null
        $cmd.Parameters['@eventID'].Direction = [System.Data.ParameterDirection]::Input
        $cmd.Parameters['@eventID'].Value = $clusterLog.ID

        $cmd.Parameters.Add("@levelDisplayName", [System.Data.SqlDbType]::varchar, 50) | Out-Null
        $cmd.Parameters['@levelDisplayName'].Direction = [System.Data.ParameterDirection]::Input
        $cmd.Parameters['@levelDisplayName'].Value = $clusterLog.LevelDisplayName

        $cmd.Parameters.Add("@message", [System.Data.SqlDbType]::VarChar, 4000) | Out-Null
        $cmd.Parameters['@message'].Direction = [System.Data.ParameterDirection]::Input
        $cmd.Parameters['@message'].Value = $clusterLog.Message

        $cmd.ExecuteNonQuery()
        $cmd.Parameters.Clear()
    }
    $conn.Close()
    $conn.Dispose()
}

标签: powershell

解决方案


这个说法:

$cmd.ExecuteNonQuery()

返回一个整数,指示受 INSERT 或 UPDATE 操作影响的行数 - 或者对于非修改操作,它将返回-1

将其更改为:

[void]$cmd.ExecuteNonQuery()
# or
$cmd.ExecuteNonQuery() |Out-Null

推荐阅读