Yo tengo entendido de que es por un comportamiento raro de los tantos que tiene Batch, en tu caso el redireccionador < siempre se "mueve" o ejecuta al final, para batch estás intentando redireccionar el contenido del archivo # para que sea procesado por el comando :, : sirve para poner etiquetas o comentar instrucciones, al final para batch quedaría así:
:<#
Se termina comentando a sí misma y no hace nada XD, aunque en realidad se convierte en una etiqueta, quizá sea mejor usar :: en lugar de : pero como no va a entrar en conflicto con otra posible etiqueta ni se la está llamando no debería haber problemas. Yo pienso que es así porque hay una técnica para hacer un Echo sin el salto de línea final:
Lo lógico sería pensar en que primero se ejecuta
set/p="Hola mundo" y luego para evitar interacción entra en juego
<nul haciendo que set/p trabaje como un simple
Echo sin salto de línea, además es completamente equivalente a:
El espacio entre # y : es necesario porque sirve de separador entre el redireccionador+nombreDeArchivo (<#) del comando :, si están juntos es equivalente a no poner el comando y dará error
Doy por hecho de que no tienes problemas con las formas de comentarios de PowerShell
---
Por cierto, puedes reducir más el script combinando los tantos métodos de PowerShell Batch wrapper que hay en línea, por ejemplo este:
#
& @Cls
& PowerShell gc '
%~f0'
^|iex
& Exit/B
write hello
Para este caso Batch piensa que # es un comando o programa pero como no existe da una advertencia/error que desaparece inmediatamente con el @Cls, útil este método si la intención del Batch es únicamente llamar a PowerShell junto con toodas sus instrucciones y nada más, y está demás decir que para PowerShell # implica un comentario de una sola línea