
Niektóre polecenia zwracają obiekty, w których pewne właściwości (np. Get-Item i Length) nie są w intuicyjnej jednostce. Zdecydowanie zamiast (B)ajtów preferuję MB, zamiast milisekund wolę sekundy lub minuty itd.
W takich sytuacjach z pomocą przychodzi Calculated Properties z poleceniem Select-Object, który umożliwia dodanie do zwracanego obiektu wyliczoną właściwość. Aby to zrobić w parametrze -Property definiujemy hashtable zawierającą odpowiednie pary klucz-wartość.
@{Name='<nazwa>';Expression={<script>}}
Zobacz konkretne przykłady.
Get-ChildItem | Select-Object -Property Name, @{Name='MB';Expression={[int]($_.Length/1mb)}} Get-ChildItem | Select-Object -Property Name, @{N='MB';E={[int]($_.Length/1mb)}} Get-Process | Sort-Object WS -Descending | Select-Object Name, @{N ='WorkingSet(MB)';E = {($_.ws/1MB)}} -First 10
Przy jednym, dwóch prostych wyrażeniach one-liner jest w porządku. Przy większej ilości oraz skomplikowanych taki zapis robi się mało czytelny i trudny do modyfikacji.
Get-CimInstance -ClassName Win32_LogicalDisk | Select-Object -Property DeviceID,@{'Name'='FreeSpace (GB)'; Expression={[int]($_.FreeSpace / 1GB)}},@{N='FreeSpace (%)';E={[int](($_.FreeSpace/$_.Size)*100)}},@{N="ToAlert";E={if ((($_.FreeSpace / $_.Size) * 100) -le 11) {$true}else {$false}}}

Dlatego w skryptach proponuję wykorzystanie Calculated Properties w takiej formie. Zapis znacznie rozdmuchany, ale od razu widać, o co chodzi.

$FreeSpaceMB = @{ 'Name' = 'FreeSpace (GB)' Expression = { [int]($_.FreeSpace / 1GB) } } $FreeSpacePercent = @{ Name = 'FreeSpace (%)' Expression= { [int](($_.FreeSpace / $_.Size) * 100) } } $ToAlert = @{ Name = 'ToAlert' Expression = { if ((($_.FreeSpace / $_.Size) * 100) -le 11) { $true } else { $false } } } $SpaceDiskProperties = 'DeviceId', $FreeSpaceMB, $FreeSpacePercent, $ToAlert Get-CimInstance -ClassName Win32_LogicalDisk | Select-Object $SpaceDiskProperties
Photo by Clay Banks on Unsplash
No comments yet.