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或$_.
答案 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