3

Using Add-Member I added a tiny method to an array of objects to calculate sort of a hash from a string:

$arr | Add-Member -MemberType ScriptMethod -Name 'SortedName' -Value {
    [string]$name = $this.Name
    [int]$start = [int][char]$name[0];
    [int]$index = [int]($name -replace '^.+?(\d+)\.[^.]+$','$1')

    [int]"$start$('{0:D4}' -f $index)"
}

Now I'd like to sort the array using $arr | Sort-Object -PropertyName 'SortedName'. But that doesn't seem to work as expected.

How can I apply Sort-Object on an array's methods?

AxD
  • 2,714
  • 3
  • 31
  • 53

1 Answers1

4

To invoke methods on each element you need to use a calculated expression.

For example:

$arr = 0..10 | ForEach-Object {
    [pscustomobject]@{ Name = 'Test' + (Get-Random -Maximum 20) }
}

$arr | Add-Member -MemberType ScriptMethod -Name SortedName -Value {
    [int] ($this.Name -replace '\D+')
}

$arr | Sort-Object { $_.SortedName() }
Santiago Squarzon
  • 41,465
  • 5
  • 14
  • 37