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


Necesito la 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

P.d. Mi directorio actual != carpeta del script.

 133
Author: Mike Chaliy, 2009-03-18

6 answers

Para el nombre de la carpeta y la unidad, 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

Este es un copy paste de " for/?"comando en el prompt. Espero que ayude.

Relacionado

Top 10 DOS Batch tips (Sí, DOS Batch...) muestra batchparams.bat (enlace a la fuente como un gist):

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
 281
Author: Wadih M.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-05 19:46:45

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 a partir de 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 <resultVar> <pathVar>
(
    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 es pasó en el archivo.

 43
Author: NightOwl888,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-08 16:48:34

Para asignarlos a variables, asegúrese de no agregar espacios delante o después del signo igual:

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

Entonces no deberías tener problemas.

 6
Author: Frank,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-02-26 22:38:38

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

Si es el último subdirectorio de la ruta de acceso, puede usar este one-liner:

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

Esto devolvería lo siguiente:

c:\directory\subdirectory

El.... vuelve al directorio anterior. / ad muestra solo directorios /b es una lista de formato desnudo / s incluye todos los subdirectorios. Esto se usa para obtener la ruta completa del directorio a imprimir.

 2
Author: Mark,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-29 16:40:17

Tuve el mismo problema en mi bucle 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, por lo 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\..
) 

% % i era una ruta de nombre de archivo completa y %ii\.. simplemente devuelve la carpeta padre.

Espero que ayude.

 2
Author: Gico,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-11 09:53:11

En caso de que la respuesta aceptada por Wadih no funcionó para usted, intente echo %CD%

 2
Author: Naguib Ihab,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-04 00:59:33