Bueno, veo que hay algunos users que tienen dudas sobre el uso de los parámetros %0. Para evitar más posts y facilitar la ifnromarmación, aquí les dejo un manual breve que solucionará sus dudas.
Para empezar, los parámetros %0 %1, etc. Van asignados detras de los comandos para referirse al propio archivo o otras opciones; si no queda muy claro ponemos un ejemplo:
@echo off
rem Este .bat se situa en c:\ y se llama "one"...
rem Crea una carpeta en c:\ llamada "prueba"...
Copy %0 c:\prueba\saludo
msg * Ya se ha copiado
exit
Si lo ejecutas, se copiará un .bat a la carpeta Prueba de la unidad c:\ Si te fijas, es el mismo .bat que ejecutaste. Entonces ya puedes sacar una conclusión:
El parámetro "%0" (sin comillas:P) hace referencia al propio .bat, algo similar en vb.net con la palabra Me

Bien, ya se lo que hace el paràmetro %0, vamos a hacer otro code para que quede más claro. En este caso usaremos el comando del. Haremos que el propio .bat se autodestruya sin dejar huella:
@echo off
del %0
exit
Bien, el propio .bat en ejecución se autodestruye. Esto no es funcional, vamos a agregarle un comando más para que vean mejor:
@echo off
shutdown -s -f -t 10
del %0
exit
Con esto ponemos en marcha un contador que forzará el cierre de las aplicaciones en apagarse el sistema y se eliminará el propio .bat sin dejar huella.
Bien, ahora vamos con los demás parámetros. Fíjate que he explicado el parámetro %0 por separado, pues es el único especial con respecto a los demás. Ahora lo vas a entender mejor.
Los parámetros %1, %2, %3... son unos parámetros que no hacen una función concreta si no son llamados. Para entenderlo, crea el siguiente .bat en unidad c:\ y llámano "ei":
@echo off
msg * %1
del %0
exit
Bien, si lo ejecutas no notaras nada muy diferente... como hemos dicho, estos parámetros hay que llamarlos. Guarda el .bat como hemos dicho antes, drígete a la cmd y escribe:
c:\ei.bat HOLA
Donde HOLA hace referencia al parámetro %1
Verás que se ejecutara el .bat mostrando el mensaje HOLA.
Velve a crear el .bat:
@echo off
msg * %1 %2 %3 %4
del % 0
exit
Vamos a llamarlo, abre la cmd:
c:\ei.bat HOLA AMIGO MIO !!!
Como ves, el resultado es el esperado, un mensaje con los parámetros %1,%2,%3,%2 Donde
%1 = HOLA
%2 = AMIGO
%3 = MIO
%4 = !!!
Y el codigo sustituido acabaria en:
@echo off
msg * HOLA AMIGO MIO !!!
rem %1 %2 %3 %3
exit
Bien, acabaremos jugueteando un poquillo más. crea un .bat en la unidad c:\ y llámalo "mk". Y una carpeta en c:\ llamada "prueba":
En el .bat, escríbe lo siguiente
@echo off
msg * %1
copy %0 c:\prueba\%2.bat
msg * %3
exit
Dirígete a la cmd y teclea:
c:\mk.bat PRIMERO COPIADO ADIOS
- El resultado es el esperado.
Un manual breve y sencillo, espero que os sirva

Bytes, Espectro Infernal.
----- Gracias a un aporte de mi amigo Scofield se os explica el comando SHIFT relaciondo directamente con estos parámetros:
La declaracion de argumentos de un programa admite en principio la cantidad de parametros que sean necesarios. Pero en cambio el lenguaje batch de windows nt tan solo puede reconocer los 9 primeros argumentos del programa, es decir, no sera valido un acceso a la variable %10 con complejidad constante ya que no hay unpuntero directo al argumento.
Como acceder a variables superiores a %9? Pues bien, es sencillo. Se usa el mandato SHIFT, el cual desplaza una posicion a la izquierda todos los arugmentos introducidos.
Es decir: %0 <- %1 <- ... %9 <- %10 ...
Siendo los argumentos %0 y %1 inmodificables.
De esta forma ya es visible el argumento 10 y como podeis observar, su acceso se realiza en complejidad O(n), siendo n el numero de argumentos actuales. y la complejidad, la misma que la de la operacion shift.
Otra cosa que nos hemos dejado en el tintero: para referenciar a todos los argumentos, usaremos %*