【问题标题】:PowerShell : -Cannot index into a null array. using a dataset from Invoke-SqlCmdPowerShell : - 无法索引到空数组。使用来自 Invoke-SqlCmd 的数据集
【发布时间】:2020-05-14 12:09:51
【问题描述】:

我遇到了以下脚本的问题。这是我想用来监视应用程序的某些作业的脚本。我使用调用 sqlcmd 来加载数据集。如果选择查询返回 atlast 1 行,所有这些都可以正常工作。

如果没有结果(通常是这种情况),那么我会收到错误:

>Cannot index into a null array.
At P:\DeploymentTESTING\PowerShell\EVENING_CHECK_JOBS_FL_WITH_DETAILS.ps1:40 char:7
+   IF ($JOBERRORS_INT.Tables[0].Rows.Count -eq 0 -and $LONGRUNNINGJOBS ...
+       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : NullArray

第一个 if 语句失败了。 我对 powershell 比较陌生,我尝试结合 Invoke Sqlcmd 找到这个问题并获得结果 -AS 数据集,但是我找不到,或者无法理解如何处理这个问题。

有人有想法吗?将不胜感激。

[string]$RESULT = "test" 

[STRING]$JOB_SERVER_ACC = "SERVERNAME"

[STRING]$JOB_DB_INT = "DATABASE"

[STRING]$QUERY_1 = "SELECT *
                    FROM [JOB]
                   WHERE  [JOB_STATUS] = 'ERR';"

[STRING]$QUERY_2 = "SELECT *
                    FROM [JOB]
                  WHERE JOB_STATUS = 'RUN'
                  AND DATEDIFF(MINUTE,JOB_LOG_START_DATETIME,sysdatetime()) > 120; "

[STRING]$QUERY_3 = "SELECT COUNT([JOB_NAME])
                  FROM [JOB]
                  WHERE JOB_STATUS = 'RUN';"

$JOBERRORS_INT = Invoke-Sqlcmd -ServerInstance $JOB_SERVER_ACC -Database $JOB_DB_INT -Query $QUERY_1 -AS DataSet 

$LONGRUNNINGJOBS_INT = Invoke-Sqlcmd -ServerInstance $JOB_SERVER_ACC -Database $JOB_DB_INT -Query $QUERY_2 -AS DataSet  

$RUNNINGJOBS_INT = Invoke-Sqlcmd -ServerInstance $JOB_SERVER_ACC -Database $JOB_DB_INT -Query $QUERY_3  


    IF ($JOBERRORS_INT.Tables[0].Rows.Count -eq 0 -and $LONGRUNNINGJOBS_INT.Tables[0].Rows.Count -eq 0 -and $RUNNINGJOBS_INT.ItemArray[0] -NE 0 ) 
   { 

        $RESULT = $RESULT + "OK"
              }
        Else {

         $RESULT = $RESULT + "NOT OK - PLEASE LOGON AND CHECK!"
            IF ($JOBERRORS_INT.Tables[0].Rows.Count -NE 0) {         

              $RESULT = $RESULT + " 
$($JOBERRORS_INT.TableS[0].Rows.Count)  JOBS IN ERROR!  " 
                              }

            IF ($LONGRUNNINGJOBS_INT.Tables[0].Rows.Count -ne $null) { 
            $RESULT = $RESULT + " 
$($LONGRUNNINGJOBS_INT.Tables[0].Rows.Count)  LONG RUNNING JOBS!"

                        }                                                          

            IF ($RUNNINGJOBS_INT.ItemArray[0] -EQ 0) { 
            $RESULT = $RESULT + "  
NO JOBS RUNNING AT ALL!"}
        }


WRITE-HOST -F DarkYellow $RESULT

【问题讨论】:

  • 您需要检查$null 的查询变量或使用Measure-Object 来计算数组中有多少结果。

标签: powershell invoke-sqlcmd


【解决方案1】:

我找到了……很明显:

$JOBERRORS_INT.Tables[0].Rows.Count -> $JOBERRORS_INT.Count

【讨论】:

    猜你喜欢
    • 2015-07-06
    • 2012-09-13
    • 2019-06-05
    • 2018-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 2017-11-23
    相关资源
    最近更新 更多