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

這給出了一個可行的輸出。我希望能夠使用Measure-Object cmdlet來計算駕駛時間和距離。PowerShell總結NoteProperties

由於distance, duration響應不是一個數字數字,字符串,我如何將這些信息再總結呢?

Get-Direction "google" "apple" -inMiles | select-object instructions, distance, duration | Measure-Object -Property Distance -sum 不能正常工作。所以,我想我至少需要一個for loop通過每個istance或$_.

+0

我建議直接查詢API 。該'GoogleMap'模塊返回從方向上的文字表述,所以會含有大量的舍入誤差的 –

+0

我真的很討厭試圖直接查詢。你必須將URL分成Powerhell中的千變量,因爲「&」被解釋爲......非常可怕。 – schnipdip

+0

一點也不,你可以構造查詢URI與單'-f'操作 –

回答

1

正如在評論中提到迭代,我建議直接查詢的路線API:

$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 

現在我們可以搶確切數值(以米爲單位)從API路由響應:

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

最後轉換爲英里的總距離:

$TotalMiles = 0.000621371 * $TotalDistance.Sum 

這樣,您就不必爲輸出是否在英里/英尺創建複雜的邏輯,你會得到更準確的結果


如果你堅持要用Get-Direction,使用calculated property推斷的數值,例如使用正則表達式:

$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 

裏面distance計算屬性的表達中,我們使用-split算子分裂的值分成兩個部分。第一部分將是數值(「0.2」,「0.2」),第二部分是單位(「mi」從「0.2 mi」)。

然後,我們檢查單位是否爲英尺,如果是這樣,則返回該值。否則,我們假設該值是以英里爲單位,所以我們將其轉換爲英尺。

現在你可以使用Measure-Object

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

因爲我們全部轉換價值腳前面,最後我們轉換的總距離回數:

$TotalMiles = 0.000189394 * $TotalDistance.Sum 
+0

你能否澄清一下第二個命令在做什麼。另外,我會從'csv'收集它。一起工作要容易得多。 – schnipdip

+0

第二個命令? 'ConvertFrom-Json'? –

+0

'$ TotalDistance = $ Route.legs.steps |選擇說明,@ {名稱= '距離'; E = {$ _ distance.value}},Duration' – schnipdip