以下陳述句在 Windows PowerShell 5.1 中執行
我有一個執行多次運行的腳本,在此期間它會創建檔案并測量它所花費的時間。結果存盤在PSCustomObject.
以下是資料示例:
> $ResultsCreate | Select-Object -First 10 | ft
Run Folder File Size Create
--- ------ ---- ---- ------
1 \\opidt660-vxzv\PB-VW_NKB$\Lmneom\vxzv \\opidt660-vxzv\PB-VW_NKB$\Lmneom\vxzv\file_1_1.bin 304087,04 00:00:00.1377073
1 \\opidt660-vxzv\PB-VW_NKB$\Lmneom\vxzv \\opidt660-vxzv\PB-VW_NKB$\Lmneom\vxzv\file_1_2.bin 608174,08 00:00:00.0776793
1 \\opidt660-vxzv\PB-VW_NKB$\Lmneom\vxzv \\opidt660-vxzv\PB-VW_NKB$\Lmneom\vxzv\file_1_3.bin 524288 00:00:00.0780064
1 \\opidt660-vxzv\PB-VW_NKB$\Lmneom\vxzv \\opidt660-vxzv\PB-VW_NKB$\Lmneom\vxzv\file_1_4.bin 922746,88 00:00:00.0759425
1 \\opidt660-vxzv\PB-VW_NKB$\Lmneom\vxzv \\opidt660-vxzv\PB-VW_NKB$\Lmneom\vxzv\file_1_5.bin 503316,48 00:00:00.0842039
1 \\opidt660-vxzv\PB-VW_NKB$\Lmneom\vxzv \\opidt660-vxzv\PB-VW_NKB$\Lmneom\vxzv\file_1_6.bin 178257,92 00:00:00.0610860
1 \\opidt660-vxzv\PB-VW_NKB$\Lmneom\vxzv \\opidt660-vxzv\PB-VW_NKB$\Lmneom\vxzv\file_1_7.bin 1038090,24 00:00:00.0916000
1 \\opidt660-vxzv\PB-VW_NKB$\Lmneom\vxzv \\opidt660-vxzv\PB-VW_NKB$\Lmneom\vxzv\file_1_8.bin 660602,88 00:00:00.0782461
1 \\opidt660-vxzv\PB-VW_NKB$\Lmneom\vxzv \\opidt660-vxzv\PB-VW_NKB$\Lmneom\vxzv\file_1_9.bin 293601,28 00:00:00.0612056
1 \\opidt660-vxzv\PB-VW_NKB$\Lmneom\vxzv \\opidt660-vxzv\PB-VW_NKB$\Lmneom\vxzv\file_1_10.bin 744488,96 00:00:00.0758247
下面是如何PSCustomObject定義的:
> $ResultsCreate | Get-Member
TypeName: Selected.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()
Create NoteProperty timespan Create=00:00:00.1377073
File NoteProperty string File=\\opidt660-vxzv\PB-VW_NKB$\Lmneom\vxzv\file_1_1.bin
Folder NoteProperty string Folder=\\opidt660-vxzv\PB-VW_NKB$\Lmneom\vxzv
Run NoteProperty int Run=1
Size NoteProperty double Size=304087,04
我想要做的是在每次運行中獲取檔案的聚合(平均值、最小值、最大值)。看起來很容易,但由于某種原因,我無法Measure-Object做我想做的事。
這是我嘗試組陣列$ResultsCreate通過Run,然后計算平均值。我最終得到一個空的$stat哈希表(鍵在那里,值是空的)。
> $($ResultsCreate |
Group-Object -Property Run -AsHashTable).GetEnumerator() |
ForEach-Object -Begin {$stat = @{}} -Process { $stat[$_.Key] = $(Measure-Object -Property $_.Value.Duration -Average) }
> $stat
Name Value
---- -----
2
1
即使是一個簡單的例子(Run完全忽略)也會失敗。
> $ResultsCreate | Measure-Object -Property $_.Create.TotalSeconds
Measure-Object : Cannot validate argument on parameter 'Property'. The argument is null or empty. Provide an argument that is not null or empty, and th
en try the command again.
At line:1 char:44
$ResultsCreate | Measure-Object -Property $_.Create.TotalSeconds
~~~~~~~~~~~~~~~~~~~~~~
CategoryInfo : InvalidData: (:) [Measure-Object], ParameterBindingValidationException
FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.PowerShell.Commands.MeasureObjectCommand
我不知道出了什么問題,它把我逼到了墻角。任何幫助、提示和/或技巧將不勝感激!
更新:終于找到了使這項作業的方法。總之,好像Measure-Object不能TotalSeconds直接訪問屬性。
> $($ResultsCreate |
select-object -Property *,@{ Name = 'TotalSeconds'; Expression = { $_.Create.TotalSeconds }} |
Group-Object -Property Run -AsHashTable).GetEnumerator() |
ForEach-Object -Begin {$stat = @{}} -Process { $stat[$_.Key] = $_.Value | Measure-Object -Property TotalSeconds -Average }
> $stat
Name Value
---- -----
2 Microsoft.PowerShell.Commands.GenericMeasureInfo
1 Microsoft.PowerShell.Commands.GenericMeasureInfo
顯然在 PS 6 之前,哈希表有點問題:
從 PowerShell 6 開始,
Measure-Object支持哈希表輸入的測量。
來源
uj5u.com熱心網友回復:
這是我設法解決問題的方法:
$($ResultsCreate |
Select-Object -Property *,@{ Name = 'TotalSeconds'; Expression = { $_.Create.TotalSeconds }} |
Group-Object -Property Run -AsHashTable).GetEnumerator() |
ForEach-Object `
-Begin {$Stats = @()} `
-Process { $Stats = $_.Value |
Measure-Object -Property TotalSeconds -Maximum -Minimum -Average |
Select-Object -Property Count, Average, Maximum, Minimum |
Add-Member -Name 'Run' -Type NoteProperty -Value $_.Key -PassThru }
最終結果是這樣的:
> $Stats | ft
Count Average Maximum Minimum Run
----- ------- ------- ------- ---
100 0,082614501 0,1272803 0,0574419 2
100 0,076335947 0,1377073 0,0597995 1
uj5u.com熱心網友回復:
目前Measure-Object不支持該TimeSpan結構。
請參閱:#10712Measure-Object 應支持 TimeSpan。
但是您可以這樣做以獲得例如組的平均時間跨度Run:
$ResultsCreate |Group-Object Run |Select-Object Name,
@{ Name = 'Average'; Expression =
{ [TimeSpan][int]($_.Group.Create.Ticks |Measure-Object -Average).Average }
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/338527.html
標籤:电源外壳
