Solucionado, pensaba que aunque fuese la lectura linea por linea detectaria que errorlevel uno no fue la opcion elegida, pero al parecer no es asi, la lee y la ejecuta... tiene leches ^^
El correcto sería asi
@echo off
color 0A
title Listar archivos carpetas
:start
set /p ruta=Inserte la ruta de la carpeta:
echo.
cd %ruta%
if errorlevel 1 (echo Inserto una ruta incorrecta, vuelva a introducirla. & cls & goto start)
:accion
set /p nombre_archivo=Inserte el nombre de archivo de texto donde guardar el resultado:
if exist "%ruta%\%nombre_archivo%.txt" (choice /c sn /m "Desea sobreescribir archivo, Si(s) o no(n): ") else goto escribir
if errorlevel 2 (cls & goto accion)
if errorlevel 1 goto escribir
:escribir
dir /b *.mp3>%nombre_archivo%.txt
pause>nul
En otros lenguajes la primera sentencia hubiera no se hubiese ejecutado y hubiera saltado a la siguiente. Es una peculiaridad de este lenguaje???