Bueno .. el servidor HTTP reconoce archivos por su formato MIME .. el navegador también .. Y dependiendo de estos así hará con el archivo que lo descarge directamente (por qué no identificó tal vez su formato MIME correcto) o lo muestre como un archivo de texto plano que ese en el fondo esos ".bat" (o como los escribes en sí).
Para solventar el problema de forma general .. debes forzar al navegador a que entienda que los datos que le enviaras serán para que los decarge, para eso le "cambiaras" y forzaras las cabeceras HTTP concretas del formato MIME que envias y del tipo de dato para que lo entienda como tal y no que lo intente interpretar ..
Basícamente sería:
descargar.php Código PHP:
<?
header("cabeceras HTTP apropiadas");
readfile("tu.bat");
?>
las cabeceras apropiadas las puedes ver en la documentación de header():
www.php.net/header
Un saludo,