El primer código tambien debiera funcionar, la variable de entorno %homedrive% encontrará la unidad, pero, bueno, si te funcionó el segundo, pues bien.
La sustitución de los parámetros del archivo por lotes (%n) ha sido
ampliada. Ahora puede usar la siguiente sintaxis opcional:
%~1 - expande %1 quitando las comillas (")que pudiera haber
%~f1 - expande %1 a un nombre completo de ruta
%~d1 - expande %1 sólo a una letra de unidad
%~p1 - expande %1 sólo a una ruta
%~n1 - expande %1 sólo a un nombre de archivo
%~x1 - expande %1 sólo a una extensión de archivo
%~s1 - expande la ruta que contiene sólo nombres cortos
%~a1 - expande %1 a los atributos del archivo
%~t1 - expande %1 a la fecha/hora del archivo
%~z1 - expande %1 al tamaño del archivo
%~$PATH: 1 - busca los directorios en la lista de la RUTA de la
variable de entorno y expande %1 al nombre totalmente
calificado del primero que encontró. Si el nombre de la
variable de entorno no se ha definido o no se ha
encontrado el archivo en la búsqueda, entonces este
modificador se transforma en una cadena vacía.
Los modificadores se pueden combinar para obtener resultados compuestos:
%~dp1 - expande %1 sólo a una letra de unidad y ruta
%~nx1 - expande %1 sólo a un nombre de archivo y extensión
%~dp$PATH:1 - busca %1 en los directorios listados en la variable de
entorno PATH y se expande a la letra de unidad y ruta
que se encontró primero.
%~ftza1 - expande %1 a DIR como una línea de salida
En el ejemplo anterior %1 y PATH pueden ser reemplazados por otros valores
válidos. Un número de argumento válido termina la sintaxis %~. Es posible
que los modificadores %~ no se puedan usar con %*
d : Letra de unidad(disk).
p : Ruta(path).
n : Nombre(name).
x : Extension.