powershell - 索引为 [-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()
}
解决方案
这个说法:
$cmd.ExecuteNonQuery()
将返回一个整数,指示受 INSERT 或 UPDATE 操作影响的行数 - 或者对于非修改操作,它将返回-1!
将其更改为:
[void]$cmd.ExecuteNonQuery()
# or
$cmd.ExecuteNonQuery() |Out-Null
推荐阅读
- android - 如何在android 11中询问所有文件权限的管理?
- bash - Bash:通过搜索获取列表的第一个文件
- javascript - 如何从 ReactNode 获取元素的高度和宽度?
- python - 检查图片网址是否有效
- performance - 什么是使用循环的优化替代方案
- python - 为什么使用文字进行 Pandas Oracle DB 查询更快?
- python - 如何获得分类数据的分组条形图
- excel - 有没有办法在每次添加新行时选择 Excel 行中的单元格以自动填充到单独工作簿中的单元格中?
- git - 为什么`git describe`显示“警告:标签'xxx'在外部称为'refs/tags/xxx'”?
- java - 如何区分 jQAssistant 中的“直接”和“间接”依赖关系