PowerShell String zerlegen in Array, DataTable, Hashtable speichern
Guten Morgen,
leider habe wieder ein Thema beim zerlegen eines Strings. Folgendes Problem:
Die Rückgabe eines Admintools liefert mir einen sehr langen String. In der Dokumentation steht, dass die Ausgabe per Komma getrennt ist und 54 Spalten umfasst. Die Ausgabe kann leider nicht modifiziert werden. Um diese Daten zu verarbeiten habe ich nun eine DataTable gebildet, die diese Daten nach einem Split entgegennimmt. Mein Problem ist nun die weitere Verarbeitung der Daten.
Wenn ich Daten aus der DataTable in ein neues Array schreibe (ist aus meiner Sicht nicht einmal notwendig), dann schreibt er mir die Daten als System.Data.DataRow ins Array. Damit kann ich aber wiederum nicht filtern und vergleichen.
Mein Ziel ist die Daten in der DataTable via $dt.jobid anzusprechen und diese zu sortieren. Bis jetzt muss ich aber in der DataTable die Zeile mitgeben $dt.jobid[1].
Wo liegt mein Fehler?
leider habe wieder ein Thema beim zerlegen eines Strings. Folgendes Problem:
Die Rückgabe eines Admintools liefert mir einen sehr langen String. In der Dokumentation steht, dass die Ausgabe per Komma getrennt ist und 54 Spalten umfasst. Die Ausgabe kann leider nicht modifiziert werden. Um diese Daten zu verarbeiten habe ich nun eine DataTable gebildet, die diese Daten nach einem Split entgegennimmt. Mein Problem ist nun die weitere Verarbeitung der Daten.
Wenn ich Daten aus der DataTable in ein neues Array schreibe (ist aus meiner Sicht nicht einmal notwendig), dann schreibt er mir die Daten als System.Data.DataRow ins Array. Damit kann ich aber wiederum nicht filtern und vergleichen.
$dt = New-Object System.Data.DataTable
$dt.Columns.Add('jobid') | Out-Null
$dt.Columns.Add('jobtype') | Out-Null
$dt.Columns.Add('state') | Out-Null
...
$dt.Columns.Add('status') | Out-Null
$dt.Columns.Add('backupid') | Out-Null
$dt.Columns.Add('killable') | Out-Null
$dt.Columns.Add('controllinghost') | Out-Null
$Output = @()
$Output = bpdbjobs -report -most_columns
$Array_Jobs = @()
for ($i=0;$i -lt $Output.Count;$i++){
$cols = $Output[$i].Trim() -split ","
$dt.Rows.Add($cols, $cols[1], $cols[2], $cols[3], $cols[4], $cols[5], $cols[6], $cols[7], $cols[8], $cols[9], $cols[10], $cols[11], $cols[12], $cols[13], $cols[14], $cols[15], $cols[16], $cols[17], $cols[18], $cols[19], $cols[20], $cols[21], $cols[22], $cols[23], $cols[24], $cols[25], $cols[26], $cols[27], $cols[28], $cols[29], $cols[30], $cols[31], $cols[32], $cols[33], $cols[34], $cols[35], $cols[36], $cols[37], $cols[38], $cols[39], $cols[40], $cols[41], $cols[42], $cols[43], $cols[44], $cols[45], $cols[46], $cols[47], $cols[48], $cols[49], $cols[50], $cols[51], $cols[52], $cols[53]) | Out-Null
}
[array]$Failed_Jobs = @()
$Failed_Jobs = $dt | ?{$_.status -ne 0} | Select -expand jobid, status, client
Write-Host $Failed_Jobs.count
Write-Host
Write-Host $Failed_Jobs
Mein Ziel ist die Daten in der DataTable via $dt.jobid anzusprechen und diese zu sortieren. Bis jetzt muss ich aber in der DataTable die Zeile mitgeben $dt.jobid[1].
Wo liegt mein Fehler?
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 309573
Url: https://administrator.de/contentid/309573
Ausgedruckt am: 05.11.2024 um 04:11 Uhr
7 Kommentare
Neuester Kommentar
You need to give a single array to the add function, not 53 single parameters!
So
is enough instead of line 17
Regards
So
$dt.Rows.Add($cols)
Regards
p.s. You don't need a datatable all the time.
You can create custom objects in powershell very easily:
and with Add-Member you can add properties (columns) to the object afterwards if you need more.
You can create custom objects in powershell very easily:
$arrayOfObjects = @()
$arrayOfObjects += [pscustomobject] @{Column1 = "Data1";Column2 = "Data2";ColumnN = "DataN"}
$arrayOfObjects
Zitat von @derhoeppi:
Powershell returns that are more than one columns are defined - so it is not possible to add this row.
?? Sure, works as designed, if the number of columns equals your array count...!Powershell returns that are more than one columns are defined - so it is not possible to add this row.
This was my first try. The result if i try to access a value like them $arrayOfObjects i got a message that it is a hashtable.
?? No, the above is an array of objects!!!Zitat von @derhoeppi:
Thats the error message: "Exception calling "Add" with "1" argument(s): "Input array is longer than the number of columns in this table.""
That's what i said, the array has to be the same length as the count of columns ...so that's normal and is a must.Thats the error message: "Exception calling "Add" with "1" argument(s): "Input array is longer than the number of columns in this table.""
Okay but that's the retun value: "System.Collections.Hashtable"
$report.jobid
You should definitely read more about custom objects ....
Working With Custom Objects
Powershell is an object oriented scripting language ...
$report must be an object array of kind
System.Management.Automation.PSCustomObject
This shortcut works starting on PS 3.0.
On PS 2.0 you have to use this form
$report += new-Object PSObject -Property @{.............}