2017-09-15 2 views
0

J'ai pris des coordonnées de plan d'état à partir d'une table SQL Server et rempli un objet avec 100 chaînes concaténées qui serviront de mon entrée dans une application Java.Accès au texte dans un objet PowerShell. Pourquoi ne semble-t-il pas être stocké dans un tableau?

$key = Invoke-Sqlcmd -Query "SELECT DISTINCT CONCAT('spc,'<spcZone>,',', 
<northing>,',',<easting>, ',',<units>,',',<inDatum>,',',<outDatum>) as 
conversionString FROM <source table>;" -ServerInstance "<server>" -Database 
"<database>" 

Le résultat sera 100 cordes qui ressemblent à ceci dans un tableau:

spc,2402,173099.419,503626.812,m,NAD83(2011),NAD83(2011) 

J'utilise ensuite l'application java gtk de la NOAA et traversent les 100 observations à convertir:

$result = FOREACH ($k in $key.conversionString) 
{ 
java -Dparms="$k" -jar H:\gtk\jtransform_thin.jar 
} 

La sortie renvoyée pour une observation ressemble à ceci:

{ 
"ID":"1489004917960", 
"nadconVersion":"5.0", 
"srcLat":"40.0000000000", 
"srcLatDms":"N400000.000000", 
"srcLon":"-80.0000000000", 
"srcLonDms":"W0800000.000000", 
"destLat":"40.0000000000", 
"destLatDms":"N400000.000000", 
"destLon":"-80.0000000000", 
"destLonDms":"W0800000.000000", 
"sigLat":"0.000000", 
"sigLon":"0.000000", 
"srcEht":"100.000", 
"destEht":"100.000", 
"sigEht":"0.000", 
"srcDatum":"NAD83(1986)", 
"destDatum":"NAD83(1986)", 
"spcZone":"PA S-3702", 
"spcNorthing_m":76470.584, 
"spcEasting_m":407886.482, 
"spcNorthing_usft":250887.241, 
"spcEasting_usft":1338207.566, 
"spcNorthing_ift":250887.743, 
"spcEasting_ift":1338210.243, 
"spcConvergence":"-01 27 35.224524", 
"spcScaleFactor":0.99999024, 
"spcCombinedFactor":0.99997455, 
"utmZone":"UTM Zone 17", 
"utmNorthing":4428236.065, 
"utmEasting":585360.462, 
"utmConvergence":"00 38 34.174932", 
"utmScaleFactor":0.9996897, 
"utmCombinedFactor":0.99967402, 
"x":849623.061, 
"y":-4818451.818, 
"z":4078049.851, 
"usng":"17TNE8536028236" 
} 

Le problème que je rencontre est l'accès aux champs retournés de l'objet $ result. Si je tape $ resultat. Il renverra tout le texte de toutes les 100 observations. Si je tape $ result [1], je n'ai que l'ID de la première observation. Si je tape $ result.ID, je n'ai rien retourné.

C'est là que je suis en train de se rendre à:

$add = foreach ($r in $result) 
{ 
"INSERT INTO SPCtoLatLong VALUES ('" + $r.spcZone + "','" + 
$r.spcNorthing_usft + "','" + $r.spcEasting_usft + "','" + $r.srcLat + "','" 
+ $r.srcLon + "','" + $r.srcDatum + "','" + $r.destDatum + "')" + $nl 
} 

Je n'ai que 2 semaines d'expérience dans PowerShell, ce que je fais mal? Merci pour toute aide.

+0

Hey Travis. Je ne peux pas dire quel est le résultat de $ type. Dites-nous quel est le résultat $ | Get-Membre crache. –

+0

@JohnDonnelly C'est un tableau de chaînes. C'est ce qui arrive lorsque vous capturez la sortie d'un programme externe. – TheIncorrigible1

Répondre

2

La sortie Stdout des applications externes est renvoyée sous la forme d'un tableau de chaînes (une ligne = une énumération). Vous devez analyser les données de retour dans un objet ou, si vous utilisez PowerShell 5+, vous pouvez utiliser le ConvertFrom-String pour créer des modèles pour ces objets et lui transmettre la sortie à convertir.

Mais! Sur la base de la façon dont bien formé vos données, je ferais ce qui suit:

$Expected = $Result | ConvertFrom-Json 

PS C:\> $Expected.GetType() 
PSCustomObject 
+0

Merci ... j'ai vu ça apparaître en même temps que je l'ai compris! J'apprécie vraiment votre aide. – TravisLong

0

j'ai compris pour résoudre ce problème, vous devez ajouter à la composante d'exécution d'applications Java.

$result = FOREACH ($k in $key.conversionString) 
{ 
java -Dparms="$k" -jar H:\gtk\jtransform_thin.jar | ConvertFrom-Json 
}