No sé muy bien que aspectos del bat necesitan explicación para ti. De modo que seguiré mi intuición a la hora de hacerlo. La instrucción más interesante de ese bat, desde mi punto de vista y porque considero que no es muy conocida es la instrucción "shift". Es muy útil cuando no se conoce el número de "parámetros" que se pasan al bat. Aunque antes voy a explicar a que llamo parámetros. A la hora de ejecutar un bat se le pueden pasar parámetros, separados por espacios. Desde dentro del bat los parámetros pasados se pueden manejar con las variables %0 (es el propio nombre del bat), %1 (el primer parámetro) y así sucesivamente hasta el %9 (creo). Pero en realidad se le pueden pasar más parámetros (imagino que el límite es la longitud permitida a una línea de comando de MSDOS) pero no tendrán, directa con las variables internas %1, %2,..., %9. La instrucción "shift" desplaza los parámetros "hacia la izquierda" de manera que después de ejecutarla una vez el antiguo primer parámetro se pierde, el que era el segundo pasa a ser el primero, y así sucesivamente.
Cuando se arrastran "cosas" a un bat, por ejemplo los nombres de archivos o carpetas, se le pasan como parámetros (poniéndolos entre comillas si tienen espacios en el nombre).
Por tanto el bucle del bat lo único que hace es ir tomando uno a uno cada nombre, siempre con la variable %1. Una vez tratado la instrucción shift hace que el siguiente nombre pase a esa variable (los demás siguen ahí, pero no nos interesan hasta la próxima vez). Si la variable %1 ya no contiene nada la instrucción
if "%~1"=="" goto :fin
termina el tratamiento. En realidad aquí aparece %~1, en vez de %1. Como se explica en la ayuda del comando FOR del MSDOS (a la que se puede acceder tecleando "for /?" en una ventana CMD), esta forma de invocar al parámetro %1 le quita las comillas si las tuviera.
El segundo "if":
if exist "%~1\*.*"
lo uso para distinguir las carpetas de los archivos porque la sintaxis de xcopy debe ser diferente.
Si necesitas alguna explicación más no dudes en pedírmela, pero concrétala un poco para evitar que te cuente cosas que ya conoces o me calle otras que te interesan.