Cómo obtener la ruta de la carpeta desde la ruta del archivo con CMD

Necesito una ruta a la carpeta que contiene el archivo cmd. Con% 0 puedo obtener el nombre del archivo. Pero, ¿cómo obtener el nombre de la carpeta?

c: \ temp \ test.cmd >> test.cmd

PD: ¡Mi directorio actual! = Carpeta del script.

Para el nombre y la unidad de la carpeta, puede usar:

echo %~dp0 

Puedes obtener mucha más información usando diferentes modificadores:

 %~I - expands %I removing any surrounding quotes (") %~fI - expands %I to a fully qualified path name %~dI - expands %I to a drive letter only %~pI - expands %I to a path only %~nI - expands %I to a file name only %~xI - expands %I to a file extension only %~sI - expanded path contains short names only %~aI - expands %I to file attributes of file %~tI - expands %I to date/time of file %~zI - expands %I to size of file The modifiers can be combined to get compound results: %~dpI - expands %I to a drive letter and path only %~nxI - expands %I to a file name and extension only %~fsI - expands %I to a full path name with short names only 

Esta es una copia pegar de “for /?” comando en el prompt. Espero eso ayude.

Relacionado

Los 10 mejores consejos para lotes de DOS (Sí, DOS Batch …) muestran batchparams.bat (enlace a la fuente como esencia):

 C:\Temp>batchparams.bat c:\windows\notepad.exe %~1 = c:\windows\notepad.exe %~f1 = c:\WINDOWS\NOTEPAD.EXE %~d1 = c: %~p1 = \WINDOWS\ %~n1 = NOTEPAD %~x1 = .EXE %~s1 = c:\WINDOWS\NOTEPAD.EXE %~a1 = --a------ %~t1 = 08/25/2005 01:50 AM %~z1 = 17920 %~$PATHATH:1 = %~dp1 = c:\WINDOWS\ %~nx1 = NOTEPAD.EXE %~dp$PATH:1 = c:\WINDOWS\ %~ftza1 = --a------ 08/25/2005 01:50 AM 17920 c:\WINDOWS\NOTEPAD.EXE 

La respuesta aceptada es útil, pero no es inmediatamente obvio cómo recuperar un nombre de archivo de una ruta si NO está utilizando valores pasados. Pude resolver esto desde este hilo, pero en caso de que otros no tengan tanta suerte, así es como se hace:

 @echo off setlocal enabledelayedexpansion enableextensions set myPath=C:\Somewhere\Somewhere\SomeFile.txt call :file_name_from_path result !myPath! echo %result% goto :eof :file_name_from_path   ( set "%~1=%~nx2" exit /b ) :eof endlocal 

Ahora la función :file_name_from_path se puede usar en cualquier lugar para recuperar el valor, no solo para los argumentos pasados. Esto puede ser extremadamente útil si los argumentos se pueden pasar al archivo en un orden indeterminado o la ruta no se pasa al archivo en absoluto.

Para asignar estos a las variables, asegúrese de no agregar espacios al frente o después del signo igual:

 set filepath=%~dp1 set filename=%~nx1 

Entonces no deberías tener problemas.

En caso de que alguien quiera un método alternativo …

Si es el último subdirectorio en la ruta, puede usar este único trazo:

 cd "c:\directory\subdirectory\filename.exe\..\.." && dir /ad /b /s 

Esto devolvería lo siguiente:

 c:\directory\subdirectory 

El …. vuelve al directorio anterior. / anuncio muestra solo directorios / b es un listado de formato desnudo / s incluye todos los subdirectorios. Esto se usa para obtener la ruta completa del directorio para imprimir.

Tuve el mismo problema en mi ciclo donde quería extraer archivos zip en el mismo directorio y luego eliminar el archivo zip. El problema era que 7z requiere la carpeta de salida, así que tuve que obtener la ruta de la carpeta de cada archivo. Aquí está mi solución:

 FOR /F "usebackq tokens=1" %%i IN (`DIR /S/B *.zip` ) DO ( 7z.exe x %%i -aoa -o%%i\.. ) 

%% era una ruta de acceso de archivo completa y% ii \ .. simplemente devuelve la carpeta principal.

Espero eso ayude.

En caso de que la respuesta aceptada por Wadih no haya funcionado para ti, prueba echo %CD%