Ich arbeite an PowerShell-Skript, das Server-Dienste überprüfen wird. Ich bekomme immer ein "Kann nicht in ein Null-Array indizieren."Warum wird mein Array als null gelesen? Was vermisse ich?
Der Fehler verweist, wenn die zweite Anweisung "if ($ select_string_result.Line [$ select_string_result.Line.Length-1] eq '1')"
Der Objekttyp von "$ select_string_result" angezeigt wird, wie Array und die TXT-Datei enthält Daten, aber das Skript wird nicht verarbeitet.
Die „Line“ Eigenschaft des Array-Datensätze als null und die „Länge“ aufgezeichnet wird, wie 0.
$filepathserver = 'Path'
$filepathlocal = 'Path'
function Get-Timestamp
{
return Get-Date -Format "MM/dd/yyyy hh:mm:ss tt"
}
function refresh-data
{
# Pulls Services and Services Status
$orionData = Get-SwisData $swis "SELECT ComponentID, StatusDescription FROM Orion.APM.Component"
# Sends output to a txt file
$orionData | Out-File "$filepathlocal\All_App_Services.txt"
}
function check-status($select_string_result)
{
if ($select_string_result.Line -isnot [system.array])
{
if ($select_string_result.Line[$select_string_result.Line.Length-1] -eq '1')
{
return 100
}
else
{
return 0
}
}
else
{
$sum = 0.0
$add = 100.0/$select_string_result.Length
foreach ($match in $select_string_result)
{
if ($match.Line[$match.Line.Length-1] -eq '1')
{
$sum += $add
}
}
if ($sum -lt 100) {$sum = 0} # this line collapses the values in to either 0 or 100
$sum = [int][Math]::Ceiling($sum)
return $sum
}
}
function main
{
refresh-data
# Filters for Application specific Services
$f = @("94944 ", "94945 ", "94951 ", "94946 ", "94942 ", "94948 ", "94949 ", "94950 ", "94943 ", "94947 ", "94952 ", "94953 ")
$AppServices = Get-Content "Path" | Select-String $f
$AppServices | Set-Content "Path"
#Removes leading spaces from array
(Get-Content "$filepathlocal\File.txt") -replace "Up","1" | % {$_.trim()} | Out-File "$filepathlocal\File.txt"
$AppServices = Get-Content "$filepathlocal\File.txt"
$AppServices.GetType()
# Writes status of each group to .txt file
$logfile= "$filepathserver\ServicesStatus.txt"
$t = Get-Timestamp
$v = check-status $AppServices
$s = "$t|Application-Services|$v"
$s | Out-File $logfile -Append -Encoding "UTF8"
$s
}
main
eine viel schönere, kurz- oder Powershell-idiomatische Funktion bekommen Können Sie erklären, was die erste 'if' Aussage tut? 'if ($ select_string_result.Line -isnot [system.array]) ' scheint zu sagen, dass das Ding, in das man zu indizieren versucht, kein Array ist. Das könnte die Ursache Ihres Problems sein. – Patrick87
Es prüft, ob ein Array übergeben wird, wenn es nicht zur else-Anweisung weitergeht und am Ende jeder Zeile in der Textdatei eine mathematische Berechnung durchführt. Da die zweite if-Anweisung aufgerufen wird, wird die Variable als Array betrachtet. Oder ich nehme an, dass es ist. Ich rufe auch eine "variable.GetType", die die Variable als ein Array meldet. – user3347022