以小时计算时差

时间:2014-07-24 23:26:28

标签: powershell amazon-web-services amazon-ec2 aws-powershell

这应该是对Amazon EC2中的虚拟机的查询,它通过它的instanceID和LaunchTime(当它被打开时)列出实例 - 我想要计算另一个列,它是LaunchTime - 当前日期/是时候获得一个名为HoursSinceBoot的“正常运行时间”统计数据。

#get instances
$instances = foreach($i in (get-ec2instance)) {$i.RunningInstance | Select-Object InstanceId,LaunchTime}
$instances | Add-Member -type NoteProperty -name HoursSinceBoot -value (Foreach-object -inputobject     $instances {New-TimeSpan -End (get-date) -Start $_.LaunchTime} | select -expandproperty hours)
$instances

这是我在下面得到错误的错误,这似乎表明Launchtime不是一个日期时间类型,当我运行一个get-member肯定就像垃圾一样。现在我知道如果我运行$ [0] .LaunchTime这段代码可以正常工作,但由于某种原因只使用$ 变量,这一切都会变成地狱。我尝试了一些日期时间转换技术,如[datetime],但它们有类似的错误“无法转换为类型日期时间”后果。

New-TimeSpan : Cannot convert 'System.Object[]' to the type 'System.DateTime' required by parameter 'Start'. Specified method is not supported.
At C:\xxx\powershell\aws-watchdog.ps1:3 char:149
+ ... t-date) -Start $_.LaunchTime} | select -expandproperty hours)
+                    ~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [New-TimeSpan], ParameterBindingException
    + FullyQualifiedErrorId : CannotConvertArgument,Microsoft.PowerShell.Commands.NewTimeSpanCommand

1 个答案:

答案 0 :(得分:1)

您可能最好在计算新HoursSinceBoot属性作为选择的一部分。

以下是一个例子:

PS C:\> $launchData = Get-EC2Instance | `
                      % { $_.RunningInstance } | `
                      Select-Object InstanceId, LaunchTime, @{Name='HoursSinceBoot'; Expression={ ((Get-Date)-$_.LaunchTime).TotalHours } }
PS C:\> $launchData | Format-Table -AutoSize

InstanceId LaunchTime              HoursSinceBoot
---------- ----------              --------------
i-abcd1234 6/11/2014 11:14:39 AM 1061.46170712353
i-efgh5678 7/11/2014 11:02:24 AM 341.665873790194

这里发生了什么:

  • Get-EC2Instance通过管道传输到Foreach-Object(按百分比符号别名),从而将RunningInstance属性从每个EC2预留对象中拉出。
  • 我们将每个RunningInstance传递给Select-Object以选择InstanceId和LaunchTime,然后生成一个名为HoursSinceBoot的新属性。
  • 表达式中有一些括号作为操作顺序的问题。它允许我们在从LaunchTime中减去之前评估当前日期,并在尝试从生成的DateTime中提取TotalHours属性之前减去该值。
  • 我合并了@andyb关于计算DateTime差异的建议。

此外,为了琐事,您可以通过在EC2实例的“描述”选项卡下进行检查来仔细检查AWS控制台上的值:

An image of a snippet of the AWS console, describing the launch time of one of my EC2 instances.