1

这应该是对 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
4

1 回答 1

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 中减去之前评估当前日期,并在尝试TotalHours从生成的 DateTime 中提取属性之前评估减去的值。
  • 我结合了@andyb 的建议来计算 DateTime 差异。

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

AWS 控制台片段的图像,描述了我的一个 EC2 实例的启动时间。

于 2014-07-25T20:56:53.590 回答