У меня возникла проблема с приведенным ниже сценарием. Это сценарий, который я хочу использовать для мониторинга некоторых заданий для приложения. Я использую команду Invoke sqlcmd для загрузки наборов данных. Все это прекрасно работает, если запросы на выборку возвращаются с atelast 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
, чтобы подсчитать количество результатов в массиве. - person Ash   schedule 14.05.2020