Powershell求和NoteProperties

时间:2017-06-14 12:27:57

标签: google-maps powershell google-maps-api-3

Get-Direction "google" "apple" -inMiles | select-object instructions, distance, duration 

这提供了可行的输出。我希望能够使用Measure-Object cmdlet来计算驾驶时间和距离。

由于distance, duration的响应不是数字,字符串,我如何提取该信息然后求它?

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

1 个答案:

答案 0 :(得分:1)

正如评论中所述,我建议直接查询Directions 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"),第二部分是单位(" mi"来自" 0.2英里")。

然后,我们检查单位是否为英尺,如果是,则返回该值。否则我们假设该值以英里为单位,因此我们将其转换为英尺。

现在您可以使用Measure-Object

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

由于我们之前将所有值转换为英尺,最后我们将总距离转换回里程:

$TotalMiles = 0.000189394 * $TotalDistance.Sum