none
Felder aus einem Arraylist-Element auslesen RRS feed

  • Frage

  • Hallo,

    ich habe ein Problem mit Arraylists in Powershell. Ich beschreibe mal grob mein Vorgehen:

    1. Holen von Daten aus einer SQL-Datenbank
    2. Speichern der DB-Daten in ein DataSet
    3. mit einem foreach jedes Element im DataSet durchgehen und in eine separate Arraylist speichern
    4. Die Inhalte der Arraylist mit einer anderen vergleichen
    5. Schreiben der verglichenen Elemente aus der Arraylist in die Datenbank

    Inhalt eines Elements in der Arraylist sieht wie folgt aus: 

    {Anwendungsname,Anwendung.exe,.*,.*,{CSIDL_APPDATA},1,False}


    Mein Problem tritt beim Punkt 5 auf. Ich möchte quasi wieder mit foreach jedes Element aus der Arrayliste herauspicken und dann die einzelnen Felder per INSERT in die Datenbank schreiben in etwa so:

    function writeDB ($arr_currentItem) {
    	$ccName = $arr_currentItem[0]
    	$ccExe = $arr_currentItem[1]
    	$ccVersion = $arr_currentItem[2]
    	$ccOS = $arr_currentItem[3]
    	$ccPath = $arr_currentItem[4]
    	$ccType = $arr_currentItem[5]
    	$ccInclude = $arr_currentItem[6]
    	
    	# Datenbank-Verbindung initialisieren
    	$Connection = New-Object System.Data.SQLClient.SQLConnection
    	$Connection.ConnectionString = "Server='$DBSRV';Trusted_Connection=true;Database='$DBTABLE'"
    	$Connection.Open()
    	
    	$Command = New-Object System.Data.SQLClient.SQLCommand
    	$Command.Connection = $Connection
    	$Command.CommandText = "INSERT INTO UPContent (Name, Executable, VersionRegEx, OSRegEx, Path, Type, Include) 
    				VALUES ($ccName, $ccExe, $ccVersion, $ccOS, $ccPath, $ccType, $ccInclude)"
    	
    	$Command.ExecuteNonQuery()
    	$Connection.Close()
    }


    Das Problem was ich nun habe ist, dass ich keine direkte Ansteuerung der Elemente der Arraylist vornehmen kann. Also $item[0] um den Anwendungsnamen heraus zubekommen funktioniert nicht, die Fehlermeldung lautet: 

    Unable to index into an object of type System.Management.Automation.ScriptBlock.
    At temp.ps1:348 char:19
    +     Write-Host $item[ <<<< 0]
        + CategoryInfo          : InvalidOperation: (0:Int32) [], RuntimeException
        + FullyQualifiedErrorId : CannotIndex

    Wie könnte ich das Problem lösen?

    Vielen Dank im voraus.

    Dienstag, 8. Mai 2012 14:38

Antworten

  • Welchen Typ hat $arr_currentItem ??

    $arr_currentItem.GetType() ?

    Welche Propertys hat $arr_currentItem ??

    $arr_currentItem | Get-Member

    Bei den Propertys siehst du wie du deine Daten aus dem $arr_currentItem heraus bekommst!

    Wenn $arr_currentItem ein String ist dann geht das so:

    function writeDB ($arr_currentItem) {
    
        $ArrayValues = $arr_currentItem -split ','
    
    	$ccName = $ArrayValues[0]
    	$ccExe = $ArrayValues[1]
    	$ccVersion = $ArrayValues[2]
    	$ccOS = $ArrayValues[3]
    	$ccPath = $ArrayValues[4]
    	$ccType = $ArrayValues[5]
    	$ccInclude = $ArrayValues[6]
    	
    	# Datenbank-Verbindung initialisieren
    	$Connection = New-Object System.Data.SQLClient.SQLConnection
    	$Connection.ConnectionString = "Server='$DBSRV';Trusted_Connection=true;Database='$DBTABLE'"
    	$Connection.Open()
    	
    	$Command = New-Object System.Data.SQLClient.SQLCommand
    	$Command.Connection = $Connection
    	$Command.CommandText = "INSERT INTO UPContent (Name, Executable, VersionRegEx, OSRegEx, Path, Type, Include) 
    				VALUES ($ccName, $ccExe, $ccVersion, $ccOS, $ccPath, $ccType, $ccInclude)"
    	
    	$Command.ExecuteNonQuery()
    	$Connection.Close()
    }


    Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '


    Dienstag, 8. Mai 2012 16:44

Alle Antworten

  • Wenn das, was du in deiner Function als Parameter hereingegeben bekommst, wirklich eine ArrayList ist, dann kannst du das so lösen ;-))

    function writeDB ($arr_currentItem) {
    
    	$ccName = $arr_currentItem.Item(0)
    	$ccExe = $arr_currentItem.Item(1)
    	$ccVersion = $arr_currentItem.Item(2)
    	$ccOS = $arr_currentItem.Item(3)
    	$ccPath = $arr_currentItem.Item(4)
    	$ccType = $arr_currentItem.Item(5)
    	$ccInclude = $arr_currentItem.Item(6)
        
    	# Datenbank-Verbindung initialisieren
    	$Connection = New-Object System.Data.SQLClient.SQLConnection
    	$Connection.ConnectionString = "Server='$DBSRV';Trusted_Connection=true;Database='$DBTABLE'"
    	$Connection.Open()
    	
    	$Command = New-Object System.Data.SQLClient.SQLCommand
    	$Command.Connection = $Connection
    	$Command.CommandText = "INSERT INTO UPContent (Name, Executable, VersionRegEx, OSRegEx, Path, Type, Include) 
    				VALUES ($ccName, $ccExe, $ccVersion, $ccOS, $ccPath, $ccType, $ccInclude)"
    	
    	$Command.ExecuteNonQuery()
    	$Connection.Close()
    }

    Siehe Doku: http://msdn.microsoft.com/de-de/library/system.collections.arraylist.aspx

    Von welchem Typ dein Parameter ist, kannst du mit $arr_currentItem | Get-Member oder mit $arr_currentItem.GetType() herausfinden.


    Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '

    Dienstag, 8. Mai 2012 15:29
  • Hallo,
    Danke für Deine Antwort.

    $arr_currentItem ist in diesem Fall keine Arraylist, sondern ein Element der Arraylist, der Name wurde von mir etwas unglücklich gewählt.

    Also:

    Arraylist: $arr_DBDataEnv1
    Element von $arr_DBDataEnv1 ist $arr_currentItem (ich gehe mit einer foreach durch die Arraylist)

    Die Ausgabe der Arraylist sieht in etwa so aus: "Anwendungsname,Anwendung.exe,^4.*,.*,{CSIDL_APPDATA},1,False".

    Ich möchte halt die einzelnen Felder des Elements herausholen, also beispielsweise "Anwendungsname". Aber mit $arr_currentItem[0] bekomme ich den Fehler den ich bereits im ersten Post genannt habe.

    • Bearbeitet wavefront6 Dienstag, 8. Mai 2012 15:53
    Dienstag, 8. Mai 2012 15:51
  • Welchen Typ hat $arr_currentItem ??

    $arr_currentItem.GetType() ?

    Welche Propertys hat $arr_currentItem ??

    $arr_currentItem | Get-Member

    Bei den Propertys siehst du wie du deine Daten aus dem $arr_currentItem heraus bekommst!

    Wenn $arr_currentItem ein String ist dann geht das so:

    function writeDB ($arr_currentItem) {
    
        $ArrayValues = $arr_currentItem -split ','
    
    	$ccName = $ArrayValues[0]
    	$ccExe = $ArrayValues[1]
    	$ccVersion = $ArrayValues[2]
    	$ccOS = $ArrayValues[3]
    	$ccPath = $ArrayValues[4]
    	$ccType = $ArrayValues[5]
    	$ccInclude = $ArrayValues[6]
    	
    	# Datenbank-Verbindung initialisieren
    	$Connection = New-Object System.Data.SQLClient.SQLConnection
    	$Connection.ConnectionString = "Server='$DBSRV';Trusted_Connection=true;Database='$DBTABLE'"
    	$Connection.Open()
    	
    	$Command = New-Object System.Data.SQLClient.SQLCommand
    	$Command.Connection = $Connection
    	$Command.CommandText = "INSERT INTO UPContent (Name, Executable, VersionRegEx, OSRegEx, Path, Type, Include) 
    				VALUES ($ccName, $ccExe, $ccVersion, $ccOS, $ccPath, $ccType, $ccInclude)"
    	
    	$Command.ExecuteNonQuery()
    	$Connection.Close()
    }


    Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '


    Dienstag, 8. Mai 2012 16:44
  • Hallo Peter,

    das -split ',' hat geholfen, vielen Dank!

    Mittwoch, 9. Mai 2012 09:53