这应该是对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
答案 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
这里发生了什么:
Select-Object
以选择InstanceId和LaunchTime,然后生成一个名为HoursSinceBoot的新属性。TotalHours
属性之前减去该值。此外,为了琐事,您可以通过在EC2实例的“描述”选项卡下进行检查来仔细检查AWS控制台上的值: