PowerShell,从一个变量中提取多个数组以创建一个变量
PowerShell, Pulling out multiple arrays from an variable to make a single variable
我有一个变量 $metrics
,由于不确定,我称它为数组的数组?我可能是错的,但这是我能想到的最好的。
这是变量。
PS C:\Windows\system32> $metrics
Id : cpuUtil01
Label : CPUUtilization
Messages : {}
StatusCode : Complete
Timestamps : {11/27/2021 7:00:00 PM, 11/27/2021 7:05:00 PM, 11/27/2021 7:10:00 PM, 11/27/2021 7:15:00 PM...}
Values : {51.22, 31.3833333333333, 31.4116666666667, 31.5283333333333...}
我想把 $metrics.timestamps
和 $metrics.values
拉出来,这样我就可以将它们导出到 CSV 文件中,这样我就可以使用 Excel 的折线图了。我不知道如何将它们两个拉出到一个变量中。
我可以一次做一个,如下所示,但我如何加入他们才能获得可以使用的 CSV。
$o = ""
$out = @()
foreach ($GetMetric in $Metrics.timestamps){
$o = New-Object -TypeName PSCustomObject -Property ([ordered]@{
TimeStampUTC = $GetMetric;
})
$out += $o
}
$out
TimeStampUTC
------------
11/27/2021 7:00:00 PM
11/27/2021 7:05:00 PM
11/27/2021 7:10:00 PM
11/27/2021 7:15:00 PM
11/27/2021 7:20:00 PM
11/27/2021 7:25:00 PM
11/27/2021 7:30:00 PM
11/27/2021 7:35:00 PM
11/27/2021 7:40:00 PM
11/27/2021 7:45:00 PM
$o = ""
$out = @()
foreach ($GetMetric in $Metrics.values){
$o = New-Object -TypeName PSCustomObject -Property ([ordered]@{
Values = $GetMetric;
})
$out += $o
}
$out
Values
------
51.22
31.3833333333333
31.4116666666667
31.5283333333333
31.4166666666667
31.425
31.4916666666667
31.4166666666667
31.325
31.5916666666667
我想要的是一个具有两个值的变量,如下所示,因此我可以将其输出到 csv 文件。
PS C:\Windows\system32> $output
TimeStampUTC Values
------------ ------
11/27/2021 7:00:00 PM 51.22
11/27/2021 7:05:00 PM 31.3833333333333
11/27/2021 7:10:00 PM 31.4116666666667
11/27/2021 7:15:00 PM 31.5283333333333
11/27/2021 7:20:00 PM 31.4166666666667
11/27/2021 7:25:00 PM 31.425
11/27/2021 7:30:00 PM 31.4916666666667
11/27/2021 7:35:00 PM 31.4166666666667
11/27/2021 7:40:00 PM 31.325
11/27/2021 7:45:00 PM 31.5916666666667
你会怎么做?
非常感谢任何帮助。
-橄榄球
<已编辑 - 附加说明>
这是我对 .GetType() 和 Get-Member
的输出
PS C:\Windows\system32> $metrics.GeTtype()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True List`1 System.Object
PS C:\Windows\system32> $metrics.Values.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Object[] System.Array
PS C:\Windows\system32> $metrics | Get-Member
TypeName: Amazon.CloudWatch.Model.MetricDataResult
Name MemberType Definition
---- ---------- ----------
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
Id Property string Id {get;set;}
Label Property string Label {get;set;}
Messages Property System.Collections.Generic.List[Amazon.CloudWatch.Model.MessageData] Messages {get;set;}
StatusCode Property Amazon.CloudWatch.StatusCode StatusCode {get;set;}
Timestamps Property System.Collections.Generic.List[datetime] Timestamps {get;set;}
Values Property System.Collections.Generic.List[double] Values {get;set;}
您尝试做的事情通常被称为“合并数组” 或“加入数组”。有很多方法可以解决这个问题,例如,使用 for
循环。
要回答您的第一个问题,$metrics
是 object
, and as any object it can have properties and methods. In this case, your object
has 3 properties which are arrays
. To give some perspective on how you can approach this in the future, it's key to know about the .GetType()
method and Get-Member
。
这是使用 [PSCustomObject]
:
重建您的对象
$metrics = [pscustomobject]@{
Id = 'cpuUtil01'
Label = 'CPUUtilization'
Messages = @()
StatusCode = 'Complete'
Timestamps = '11/27/2021 7:00:00 PM','11/27/2021 7:05:00 PM','11/27/2021 7:10:00 PM'
Values = '51.22','31.3833333333333','31.4116666666667','31.5283333333333'
}
现在我们可以付诸实践了:
PS /> $metrics.GeTtype()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True False PSCustomObject System.Object
PS /> $metrics.Values.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Object[] System.Array
PS /> $metrics | Get-Member
TypeName: System.Management.Automation.PSCustomObject
Name MemberType Definition
---- ---------- ----------
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
Id NoteProperty string Id=cpuUtil01
Label NoteProperty string Label=CPUUtilization
Messages NoteProperty Object[] Messages=System.Object[]
StatusCode NoteProperty string StatusCode=Complete
Timestamps NoteProperty Object[] Timestamps=System.Object[]
Values NoteProperty Object[] Values=System.Object[]
现在回答主要问题,如何合并两个数组?:
- 首先我们需要知道两者是否具有相同的
length
,否则我们将丢失信息:
$maxCount = [math]::Max($metrics.TimeStamps.Count, $metrics.Values.Count)
然后使用 for
循环遍历每个数组的每个元素,从它们的值中创建一个新对象:
$result = for($i = 0; $i -lt $maxCount; $i++)
{
[pscustomobject]@{
TimeStamps = $metrics.TimeStamps[$i]
Values = $metrics.Values[$i]
}
}
PS /> $result
TimeStamps Values
---------- ------
11/27/2021 7:00:00 PM 51.22
11/27/2021 7:05:00 PM 31.3833333333333
11/27/2021 7:10:00 PM 31.4116666666667
11/27/2021 7:15:00 PM 31.5283333333333
我有一个变量 $metrics
,由于不确定,我称它为数组的数组?我可能是错的,但这是我能想到的最好的。
这是变量。
PS C:\Windows\system32> $metrics
Id : cpuUtil01
Label : CPUUtilization
Messages : {}
StatusCode : Complete
Timestamps : {11/27/2021 7:00:00 PM, 11/27/2021 7:05:00 PM, 11/27/2021 7:10:00 PM, 11/27/2021 7:15:00 PM...}
Values : {51.22, 31.3833333333333, 31.4116666666667, 31.5283333333333...}
我想把 $metrics.timestamps
和 $metrics.values
拉出来,这样我就可以将它们导出到 CSV 文件中,这样我就可以使用 Excel 的折线图了。我不知道如何将它们两个拉出到一个变量中。
我可以一次做一个,如下所示,但我如何加入他们才能获得可以使用的 CSV。
$o = ""
$out = @()
foreach ($GetMetric in $Metrics.timestamps){
$o = New-Object -TypeName PSCustomObject -Property ([ordered]@{
TimeStampUTC = $GetMetric;
})
$out += $o
}
$out
TimeStampUTC
------------
11/27/2021 7:00:00 PM
11/27/2021 7:05:00 PM
11/27/2021 7:10:00 PM
11/27/2021 7:15:00 PM
11/27/2021 7:20:00 PM
11/27/2021 7:25:00 PM
11/27/2021 7:30:00 PM
11/27/2021 7:35:00 PM
11/27/2021 7:40:00 PM
11/27/2021 7:45:00 PM
$o = ""
$out = @()
foreach ($GetMetric in $Metrics.values){
$o = New-Object -TypeName PSCustomObject -Property ([ordered]@{
Values = $GetMetric;
})
$out += $o
}
$out
Values
------
51.22
31.3833333333333
31.4116666666667
31.5283333333333
31.4166666666667
31.425
31.4916666666667
31.4166666666667
31.325
31.5916666666667
我想要的是一个具有两个值的变量,如下所示,因此我可以将其输出到 csv 文件。
PS C:\Windows\system32> $output
TimeStampUTC Values
------------ ------
11/27/2021 7:00:00 PM 51.22
11/27/2021 7:05:00 PM 31.3833333333333
11/27/2021 7:10:00 PM 31.4116666666667
11/27/2021 7:15:00 PM 31.5283333333333
11/27/2021 7:20:00 PM 31.4166666666667
11/27/2021 7:25:00 PM 31.425
11/27/2021 7:30:00 PM 31.4916666666667
11/27/2021 7:35:00 PM 31.4166666666667
11/27/2021 7:40:00 PM 31.325
11/27/2021 7:45:00 PM 31.5916666666667
你会怎么做?
非常感谢任何帮助。
-橄榄球
<已编辑 - 附加说明>
这是我对 .GetType() 和 Get-Member
的输出PS C:\Windows\system32> $metrics.GeTtype()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True List`1 System.Object
PS C:\Windows\system32> $metrics.Values.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Object[] System.Array
PS C:\Windows\system32> $metrics | Get-Member
TypeName: Amazon.CloudWatch.Model.MetricDataResult
Name MemberType Definition
---- ---------- ----------
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
Id Property string Id {get;set;}
Label Property string Label {get;set;}
Messages Property System.Collections.Generic.List[Amazon.CloudWatch.Model.MessageData] Messages {get;set;}
StatusCode Property Amazon.CloudWatch.StatusCode StatusCode {get;set;}
Timestamps Property System.Collections.Generic.List[datetime] Timestamps {get;set;}
Values Property System.Collections.Generic.List[double] Values {get;set;}
您尝试做的事情通常被称为“合并数组” 或“加入数组”。有很多方法可以解决这个问题,例如,使用 for
循环。
要回答您的第一个问题,$metrics
是 object
, and as any object it can have properties and methods. In this case, your object
has 3 properties which are arrays
. To give some perspective on how you can approach this in the future, it's key to know about the .GetType()
method and Get-Member
。
这是使用 [PSCustomObject]
:
$metrics = [pscustomobject]@{
Id = 'cpuUtil01'
Label = 'CPUUtilization'
Messages = @()
StatusCode = 'Complete'
Timestamps = '11/27/2021 7:00:00 PM','11/27/2021 7:05:00 PM','11/27/2021 7:10:00 PM'
Values = '51.22','31.3833333333333','31.4116666666667','31.5283333333333'
}
现在我们可以付诸实践了:
PS /> $metrics.GeTtype()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True False PSCustomObject System.Object
PS /> $metrics.Values.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Object[] System.Array
PS /> $metrics | Get-Member
TypeName: System.Management.Automation.PSCustomObject
Name MemberType Definition
---- ---------- ----------
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
Id NoteProperty string Id=cpuUtil01
Label NoteProperty string Label=CPUUtilization
Messages NoteProperty Object[] Messages=System.Object[]
StatusCode NoteProperty string StatusCode=Complete
Timestamps NoteProperty Object[] Timestamps=System.Object[]
Values NoteProperty Object[] Values=System.Object[]
现在回答主要问题,如何合并两个数组?:
- 首先我们需要知道两者是否具有相同的
length
,否则我们将丢失信息:
$maxCount = [math]::Max($metrics.TimeStamps.Count, $metrics.Values.Count)
然后使用 for
循环遍历每个数组的每个元素,从它们的值中创建一个新对象:
$result = for($i = 0; $i -lt $maxCount; $i++)
{
[pscustomobject]@{
TimeStamps = $metrics.TimeStamps[$i]
Values = $metrics.Values[$i]
}
}
PS /> $result
TimeStamps Values
---------- ------
11/27/2021 7:00:00 PM 51.22
11/27/2021 7:05:00 PM 31.3833333333333
11/27/2021 7:10:00 PM 31.4116666666667
11/27/2021 7:15:00 PM 31.5283333333333