¿Por qué falla la expansión retrasada cuando se encuentra dentro de un bloque de código canalizado?

Aquí hay un archivo por lotes simple que demuestra cómo falla la expansión demorada si está dentro de un bloque que se está canalizando. (El fallo es hacia el final del guión) ¿Alguien puede explicar por qué es esto?

Tengo una solución alternativa, pero requiere la creación de un archivo temporal. Inicialmente me encontré con este problema mientras trabajaba en Busque archivos y ordene por tamaño en un archivo por lotes de 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

Aquí están los resultado

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

Respuestas a la pregunta(3)

Su respuesta a la pregunta