Ваши разрывы строк для разделения однострочных команд используют экранирование новой строки вместо встроенной функции разрыва строки конвейера…

Есть ли причина, по которой вы не делаете что-то подобное вместо этого?

if ((isPsCustomObject $a) -and (isPsCustomObject $b)) {
   $inequalKeys = $a.psobject.Properties + $b.psobject.Properties |
      ForEach-Object Name |
      Sort-Object -Unique |
      Where-Object { -not (recursiveEquality $a.$_ $b.$_) }
   return $inequalKeys.Count -eq 0
}