2017-09-08 2 views
0

Okay, ich muss ein Array mithilfe der deviceId durchlaufen. Alles fügt gut, das Problem ist, dass die Obj-Tags nicht aus der API gezogen wird, weil ein Array ist und an die Geräte-ID gebunden ist. Also habe ich beschlossen, eine andere Tabelle zu erstellen, während das Skript läuft, kann es die Geräte-IDs ziehen und einfügen, so dass die Tags aus der API gezogen und in die andere Tabelle eingefügt werden können, wo ich später beitreten kann. Das Problem ist, dass ich ein anderes für jedes getan habe und nur die letzte Identifikation einfüge und keine Umbauten sind sogar gezogen worden. Irgendwelche Vorschläge?Nicht in der Lage, ein Array mit Powershell durchzulaufen

#For loop giving variables to the objects 
foreach($obj in $Json.devices) 
{ 
    $DeviceIdentifier = $obj.deviceid 
    $DeviceNombre = $obj.deviceName 
    $DomainNombre = $obj.domainName 
    $Description = $obj.description 
    $Tags = $obj.tags 
    $location = $obj.location 
    $Os = $obj.os 


    Write-Host ($obj.devicename) -BackgroundColor White -ForegroundColor red 
    Write-Host ($obj.domainname) -BackgroundColor White -ForegroundColor red 
    Write-Host ($obj.deviceid) -BackgroundColor White -ForegroundColor DarkGreen 
    Write-Host ($obj.tags) -BackgroundColor White -ForegroundColor black 
    Write-Host ($obj.description) -BackgroundColor White -ForegroundColor blue 
    Write-Host ($obj.os) -BackgroundColor White -ForegroundColor DarkBlue 

    #Inserting into MYSQL database 
    $cmd = $connection.CreateCommand() 
    $insert_stmt = "INSERT INTO [dbo].[Tags]([DeviceID],[Device Name],[Domain Name],[Description],[Tags],[Location],[Os]) 
          VALUES ('$DeviceIdentifier','$DeviceNombre', '$DomainNombre','$Description','$tags','$location','$Os')" -replace "\s+"," " 
    $cmd.CommandText = $insert_stmt 
    write-host $insert_stmt -BackgroundColor White -ForegroundColor DarkBlue 
    $cmd.ExecuteNonQuery() 
} 


foreach($Tags in $DeviceIdentifier) 
{ 
    $DeviceIdentifier = $Tags.deviceid 
    $Tags = $obj.tags 

    Write-Host ($obj.deviceid) -BackgroundColor White -ForegroundColor DarkGreen 
    Write-Host ($obj.tags) -BackgroundColor White -ForegroundColor black 

    #Inserting into MYSQL database 
    $cmd = $connection.CreateCommand() 
    $insert_stmt = "INSERT INTO [dbo].[TagsTable]([DeviceID],[Tags]) 
          VALUES ('$DeviceIdentifier','$tags')" -replace "\s+"," " 
    $cmd.CommandText = $insert_stmt 
    write-host $insert_stmt -BackgroundColor White -ForegroundColor DarkBlue 
    $cmd.ExecuteNonQuery() 
} 

$Connection.Close() 

Antwort

1

Bei jedem Durchlauf beiden Schleifen speichern Sie einen einzigen Wert in $DeviceIdentifier: $DeviceIdentifier = $obj.deviceid/$DeviceIdentifier = $Tags.deviceid. Im zweiten überschreiben Sie sogar die verwendete Sammlung.

Sie könnten (zum Beispiel) ein Array vor der Schleife mit $array = @() erstellen und Werte in der Schleife mit $array += $obj.deviceid hinzufügen.

0

Was sodawillow sagte, ist genau und guter Rat. Verwenden Sie solche Variablen nicht erneut und definieren Sie Arrays vor Ihren Schleifen, um Umfangsprobleme zu vermeiden. Das sieht so aus, als ob es eine einfache Lösung sein sollte. Sie führen zwei Schleifen aus, aber es sieht so aus, als wollten Sie nur das gleiche Array iterieren und Aktualisierungen von diesem Array auf zwei verschiedene Tabellen anwenden. Cool, gib einfach zwei SQL-Anweisungen in jeden Durchgang der Schleife. Außerdem verschiebe ich Ihre Erstellung von $cmd außerhalb der Schleife. Es muss nicht jedes Mal neu erstellt werden.

$cmd = $connection.CreateCommand() 

#For loop giving variables to the objects 
foreach($obj in $Json.devices) 
{ 
    $DeviceIdentifier = $obj.deviceid 
    $DeviceNombre = $obj.deviceName 
    $DomainNombre = $obj.domainName 
    $Description = $obj.description 
    $Tags = $obj.tags 
    $location = $obj.location 
    $Os = $obj.os 


    Write-Host ($obj.devicename) -BackgroundColor White -ForegroundColor red 
    Write-Host ($obj.domainname) -BackgroundColor White -ForegroundColor red 
    Write-Host ($obj.deviceid) -BackgroundColor White -ForegroundColor DarkGreen 
    Write-Host ($obj.tags) -BackgroundColor White -ForegroundColor black 
    Write-Host ($obj.description) -BackgroundColor White -ForegroundColor blue 
    Write-Host ($obj.os) -BackgroundColor White -ForegroundColor DarkBlue 

    #Inserting into MYSQL database 
    $insert_stmt = "INSERT INTO [dbo].[Tags]([DeviceID],[Device Name],[Domain Name],[Description],[Tags],[Location],[Os]) 
          VALUES ('$DeviceIdentifier','$DeviceNombre', '$DomainNombre','$Description','$tags','$location','$Os')" -replace "\s+"," " 
    $cmd.CommandText = $insert_stmt 
    write-host $insert_stmt -BackgroundColor White -ForegroundColor DarkBlue 
    $cmd.ExecuteNonQuery() 

    Write-Host ($obj.deviceid) -BackgroundColor White -ForegroundColor DarkGreen 
    Write-Host ($obj.tags) -BackgroundColor White -ForegroundColor black 

    #Inserting into MYSQL database 
    $insert_stmt2 = "INSERT INTO [dbo].[TagsTable]([DeviceID],[Tags]) 
          VALUES ('$DeviceIdentifier','$tags')" -replace "\s+"," " 
    $cmd.CommandText = $insert_stmt2 
    write-host $insert_stmt2 -BackgroundColor White -ForegroundColor DarkBlue 
    $cmd.ExecuteNonQuery() 
} 

$Connection.Close()