Obtener el nombre de la carpeta actual con un comando de DOS?


60

¿Es posible obtener el nombre de la carpeta actual (no la ruta actual del directorio) utilizando un comando de DOS? ¿Si es así, cómo?

Lo más cercano que obtuve fue esto, pero no lo hace:

for /f "delims=\" %%a in ("%CD%") do set CURR=%%a
echo.DIR: %CURR%

nota: el intento anterior fue tratar de tokenizar la cadena y obtener el último token establecido como la variable CURR.


Si has conjunto de herramientas instalado ningún tipo de GNU, usted debe ser capaz de ir cd | sed "s/.*\\//"(que canaliza la salida de cd (CWD) en una búsqueda de expresiones regulares y reemplazar, sustituir todo antes de la final \ sin nada en absoluto)
Phoshi

2
Necesito evitar las herramientas GNU para que el archivo por lotes funcione en cualquier lugar para cualquier persona. Mi pregunta es para "DOS puro" de todos modos.
djangofan el

Bien. Un google rápido mostró un resultado SO para implementar la búsqueda y reemplazo de expresiones regulares en VBScript ( stackoverflow.com/questions/127318/… ) que podría usar la misma sintaxis y crear el mismo resultado: creo que VBScript se ha incorporado desde Windows 98, por lo que ¡debería estar en cualquier lugar para todos! (También podría rejiggerlo fácilmente para que funcione en * nix OS 'también)
Phoshi

3
Para su información, for /fni los de TomWij %~n*son compatibles con MS-DOS. (Windows ' nocmd.exe es DOS, es un programa nativo de Windows)
Grawity

Respuestas:


85

El camino más corto que he encontrado:

for %I in (.) do echo %~nxI

o dentro de un script .bat:

for %%I in (.) do echo %%~nxI

o en .bat con Obtener valor en variable.

for %%I in (.) do set CurrDirName=%%~nxI
echo %CurrDirName%

Explicación: http://www.robvanderwoude.com/ntfor.php

nx significa solo nombre de archivo y extensión


Me gusta el enlace y la sugerencia, pero cuando lo pongo en un archivo por lotes obtengo un cierre inmediato del shell sin salida. debe haber un error de sintaxis en alguna parte?
djangofan el

3
El ejemplo funcionará en la línea de comando de forma interactiva. Para usarlo en un archivo por lotes, debe reemplazar todas las apariciones de %con %%.
Mike Fitzpatrick

2
Además, el ejemplo no maneja correctamente los nombres de carpeta que contienen un punto ( .), como mi carpeta% USERPROFILE%.
Mike Fitzpatrick

1
Sí, funciona si reemplaza '%' con '%%'. Buena respuesta. Hubiera sido la respuesta aceptada si eso se señaló anteriormente.
djangofan

1
Cualquiera que sea este hechicero malvado, me alegro de que funcione. Estoy familiarizado con la mayoría de la sintaxis de expansión, pero nunca la había visto *antes oo
kayleeFrye_onDeck

30

Si desea conocer la ubicación actual del archivo por lotes (y si su Windows no es una versión muy antigua), escriba for /?en una ventana 'cuadro de DOS'. Desplácese hacia abajo. Leer.

Descubrirá que ahora puede leer (desde dentro del archivo por lotes) estas variables:

%0      - as the name how this batchfile was called
%~d0    - as the drive letter where this batchfile is located ('\\' in case of share)
%~p0    - as path (without the drive letter) where this batchfile is located
%~n0    - as filename (without suffix) of this batchfile
%~x0    - as filename's suffix (without filename) of this batchfile
%~a0    - as this batchfile's file attributes
%~t0    - as this batchfile's date+time
%~z0    - as this batchfile's filesize
%~dpnx0 - as this batchfile's fully qualified path+filename
[... and then some more ...]

Esto funciona para muchos casos. Supongamos que se llama al archivo por lotes mytest.bat. Puede llamarlo de diferentes maneras:

  1. ..\..\to\mytest.bat ............................... (ruta relativa)
  2. d:\path\to\mytest.bat........................... (ruta completa)
  3. \\fileserver\sharename\mytest.bat... (ruta en el recurso compartido remoto)

... y siempre obtendrás el valor correcto en tus variables.


1
wow, curiosamente tu derecho. El comando "echo% ~ dp0" resuelve mi problema también y es más elegante.
djangofan

55
Ok, entonces, ¿te importaría otorgarme un '+1'?
Kurt Pfeifle

No, por la razón de que 'para /?' fue el primer lugar obvio que busqué, por lo que esta respuesta no es mejor de lo que se espera de nadie.
djangofan

44
@djangofan: ¿Entonces dices 'Guau, curiosamente tienes razón ...' a algo que ya sabías? ¿A una respuesta que no contribuyó a su conocimiento? (Sabes, '+1' hace clic en la flecha ^, es diferente de responder una respuesta aceptada ...)
Kurt Pfeifle

1
parece que el último debería ser %~dpnx0, ¿no?
luc

15

Personalmente, me gustó la respuesta de Toms, hasta que luchó con puntos en los nombres de directorio. Esto me dio una pista:

for /f "delims=\" %%a in ("%cd%") do echo topmost dir: %%~nxa

5

La respuesta de Tom es buena, pero si tiene un nombre de directorio con un punto (es decir, wxwidgets-2.9.4) solo obtendrá el nombre completo. Entonces, esto generaría wxwidgets-2.9 ​​en su lugar porque el .4 ha sido tratado como una extensión (¡Sí, a pesar de que es un nombre de directorio!).

Para obtener el nombre de salida completo, debe agregar la extensión hasta el final:

FOR %I IN (.) DO Echo %~nI%~xI

y en modo de archivo por lotes:

FOR %%I IN (.) DO Echo %%~nI%%~xI

O, por supuesto, establezca una variable en el archivo por lotes:

FOR %%I IN (.) DO SET CurrentD=%%~nI%%~xI

4

Otra forma es:

set "MyPath=%~dpnx0" & call set "MyPath=%%MyPath:\%~nx0=%%" 
echo MyPath=%MyPath%  

funciona con "." y espacios en ruta

¿Qué hace?

  1. poner todo el nombre de archivo (driveletter-path-filename-extension) en MyPathVar

  2. eliminar el nombre de archivo y la extensión de MyPathvar

También funciona con UNC Paths. Si necesita la barra invertida al final del camino. Elimine el \after MyPathen el segundo comando set, ej.

set "MyPath=%%MyPath:%~nx0=%%"

1
Entonces, ¿cómo es esto diferente de%~dp0
Amit Naidu

4

Puede obtener el directorio actual en una variable. Un trazador de líneas:

set a=%cd%

Verifícalo con

echo %a%

66
Quiere el nombre del directorio actual, no la ruta completa, y como a == cd, también puede usar% cd%.
paradroid

2

así de simple

for %%d in ("%CD%") do echo %%~nxd

o

set "sPath=."
for %%d in ("%sPath%") do set "sDirName=%%~nxd"

Tenga cuidado con la barra invertida del final del camino, no tiene que ser la barra invertida del final.


1

Mi respuesta en este hilo lo hace en 3 líneas simples:

@echo off
SET "CDIR=%~dp0"
:: for loop requires removing trailing backslash from %~dp0 output
SET "CDIR=%CDIR:~0,-1%"
FOR %%i IN ("%CDIR%") DO SET "PARENTFOLDERNAME=%%~nxi"
ECHO Parent folder: %PARENTFOLDERNAME%
ECHO Full path: %~dp0
pause>nul

1

Esto funciona para mí desde un archivo por lotes. Devuelve el nombre del directorio de trabajo actual.

pushd %1 & for %%i in (.) do @echo %%~ni
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.