2017-06-14 2 views
0
Get-Direction "google" "apple" -inMiles | select-object instructions, distance, duration 

Dies ergibt eine brauchbare Ausgabe. Ich möchte das Measure-Object Cmdlet verwenden, um die Fahrzeit und die Entfernung zu berechnen.Powershell-Summierung NoteProperties

Da die Antwort von distance, duration ist keine numerische Zahl, eine Zeichenfolge, wie ziehe ich diese Informationen und summiere es dann?

Get-Direction "google" "apple" -inMiles | select-object instructions, distance, duration | Measure-Object -Property Distance -sum funktioniert nicht wie erwartet. Also ich denke, ich zumindest müssen eine for loop durch jede istance iterieren oder $_.

+0

Ich würde vorschlagen, dass die API direkt abfragt . Das 'GoogleMap'-Modul gibt die Textdarstellungen aus den Richtungen zurück und enthält daher viele Rundungsfehler. –

+0

Ich hasse es wirklich, direkt Abfragen durchzuführen. Sie müssen die URL in tausend Powershell-Variablen zerlegen, weil "&" interpretiert wird ... Ganz schrecklich. – schnipdip

+0

Überhaupt nicht, können Sie die Abfrage uri mit einer einzigen '-f'-Operation erstellen –

Antwort

1

Wie in den Kommentaren erwähnt, würde ich vorschlagen, die Directions API abfragt direkt:

$From = 'google' 
$To = 'apple' 
$APIKey = 'ASDASdDGerYYeb7_zfd' # replace with actual key 
$requestURI = 'https://maps.googleapis.com/maps/api/directions/json?origin={0}&destination={1}&mode=driving&units=metric&key={2}' -f $From,$To,$APIKey 

$APIResponse = Invoke-WebRequest $requestURI -UseBasicParsing 
$Route = $APIResponse.Content |ConvertFrom-Json |Select -First 1 -Expand routes 

Jetzt können wir das packen genauer Zahlenwert (in Metern) von der API-Route Antwort:

$TotalDistance = $Route.legs.steps |Select Instructions,@{name='Distance';e={$_.distance.value}},Duration |Measure-Object Distance -Sum 

Und schließlich die Gesamtdistanz in Meilen umwandeln:

$TotalMiles = 0.000621371 * $TotalDistance.Sum 

Auf diese Weise müssen Sie für komplexe Logik nicht erstellen, ob die Ausgabe ist in Meilen/Fuß, und Sie werden ein genaueres Ergebnis


Wenn Sie sich mit Get-Direction bestehen erhalten, verwenden ein calculated property den numerischen Wert, zum Beispiel unter Verwendung von Regex extrapolieren:

$directions = Get-Direction "google" "apple" -inMiles | select-object instructions, @{name='Distance';expression={$value,$unit = $_.distance -split ' ',2;if($unit -eq 'ft'){$value}else{5280 * $value}}}, duration 

im Innern des Ausdrucks Teil der distance berechneten Eigenschaft, teilten wir den Wert in zwei Teile mit dem -split Operator. Der erste Teil ist der numerische Wert ("0,2" von "0,2 mi"), und der zweite Teil ist die Einheit ("mi" von "0,2 mi").

Dann überprüfen wir, ob die Einheiten Füße sind, wenn ja, geben Sie einfach den Wert zurück. Andernfalls nehmen wir an, dass der Wert in Meilen ist, und wir wandeln ihn in Fuß um.

Jetzt können Sie verwenden Measure-Object:

$TotalDistance = $directions |Measure-Object Distance -Sum 

Da wir alle Wert auf die Füße vorher umgewandelt, schließlich wandeln wir die Gesamtstrecke zurück zum Meilen:

$TotalMiles = 0.000189394 * $TotalDistance.Sum 
+0

Könnten Sie bitte klarstellen, was der zweite Befehl macht? Außerdem werde ich es von 'csv' sammeln. Es ist viel einfacher mit zu arbeiten. – schnipdip

+0

Der zweite Befehl? 'Konvertieren von-Json'? –

+0

'$ TotalDistance = $ Route.legs.steps | Wähle Anweisungen, @ {Name = 'Entfernung'; e = {$ _. Abstand.Wert}}, Dauer' – schnipdip