Por que a expansão atrasada falha quando dentro de um bloco de código canalizad

Aqui está um arquivo em lotes simples que demonstra como a expansão atrasada falha se estiver dentro de um bloco que está sendo canalizado. (A falha está no final do script) Alguém pode explicar por que isso acontece?

Tenho uma solução alternativa, mas requer a criação de um arquivo temporário. Inicialmente, tive esse problema enquanto trabalhava em Encontre arquivos e classifique por tamanho em um arquivo em lotes do Windows

@echo off
setlocal enableDelayedExpansion

set test1=x
set test2=y
set test3=z

echo(

echo NORMAL EXPANSION TEST
echo Unsorted works
(
  echo %test3%
  echo %test1%
  echo %test2%
)
echo(
echo Sorted works
(
  echo %test3%
  echo %test1%
  echo %test2%
) | sort

echo(
echo ---------
echo(

echo DELAYED EXPANSION TEST
echo Unsorted works
(
  echo !test3!
  echo !test1!
  echo !test2!
)
echo(
echo Sorted fails
(
  echo !test3!
  echo !test1!
  echo !test2!
) | sort
echo(
echo Sort workaround
(
  echo !test3!
  echo !test1!
  echo !test2!
)>temp.txt
sort temp.txt
del temp.txt

Aqui estão os resultados

NORMAL EXPANSION TEST
Unsorted works
z
x
y

Sorted works
x
y
z

---------

DELAYED EXPANSION TEST
Unsorted works
z
x
y

Sorted fails
!test1!
!test2!
!test3!

Sort workaround
x
y
z

questionAnswers(3)

yourAnswerToTheQuestion