2010-07-06 21:29:58 +0000 2010-07-06 21:29:58 +0000
68
68

Obter o nome da pasta actual através de um comando DOS?

É possível obter o nome da pasta actual (não o caminho do directório actual) usando um comando DOS? Em caso afirmativo, como?

O mais próximo que consegui foi isto, mas não o faz:

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

nota: a tentativa acima foi eu a tentar marcar a corda e obter o último símbolo definido como a variável CURR.

Respostas (9)

95
95
95
2010-07-06 22:27:07 +0000

A forma mais curta que encontrei:

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

ou dentro de um script .bat

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

ou dentro de um .bat com Get value em variável.

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

Explicação: http://www.robvanderwoude.com/ntfor.php

nx significa apenas nome de ficheiro e extensão

31
31
31
2010-08-07 14:55:35 +0000

Se quiser saber a localização actual do ficheiro de lote (e se o seu Windows não for um lançamento muito antigo), escreva for /? numa janela ‘DOS box’. Desça. Leia.

Descobrirá, que pode agora ler (a partir de no ficheiro de lote) estas variáveis:

%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 ...]

Isto funciona para muitos casos. Assumir, o ficheiro de lote chama-se mytest.bat. Pode chamá-lo de diferentes formas:

  1. ..\..\to\mytest.bat …………………………. (caminho relativo)
  2. d:\path\to\mytest.bat ……………………… (caminho completo)
  3. \fileserver\sharename\mytest.bat(caminho na partilha remota)

…e terá sempre o valor certo nas suas variáveis.

16
16
16
2011-11-17 09:20:12 +0000

Eu pessoalmente gostei da resposta de Toms, até que se debateu com pontos em nomes de dir. Isto ](http://forums.devshed.com/windows-help-34/finding-last-token-in-batch-file-412970.html) deu-me uma dica:

for /f "delims=\" %%a in ("%cd%") do echo topmost dir: %%~nxa
5
5
5
2013-08-06 13:11:55 +0000

A resposta de Tom é boa, mas se tiver um nome de directório com um ponto final (isto é, wxwidgets-2.9.4) só receberá o nome completo. Assim, isto daria origem a wxwidgets-2.9 em vez disso, porque o .4 foi tratado como uma extensão (Sim, embora seja um nome de directório!).

Para obter o nome completo de saída terá de adicionar na extensão até ao fim:

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

e em modo de ficheiro batch:

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

ou, claro, definir uma variável no ficheiro de lote em vez disso:

FOR %%I IN (.) DO SET CurrentD=%%~nI%%~xI
4
4
4
2012-03-15 10:19:31 +0000

Uma outra forma é:

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

funciona com “.” e espaços no caminho

O que é que faz?

  1. coloca todo o nome do ficheiro (driveletter-path-filename-extension) em MyPath Var

  2. remove o nome do ficheiro e extensão de MyPath var

Funciona também com UNC Paths. Se precisar da contrabarra no fim do Caminho. Remover a `Uma outra forma é:

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

funciona com “.” e espaços no caminho

O que é que faz?

  1. coloca todo o nome do ficheiro (driveletter-path-filename-extension) em MyPath Var

  2. remove o nome do ficheiro e extensão de MyPath var

Funciona também com UNC Paths. Se precisar da contrabarra no fim do Caminho. Remover a depois da MyPath no segundo comando do conjunto, por exemplo

set "MyPath=%%MyPath:%~nx0=%%"
4
4
4
2012-04-24 15:54:31 +0000

Pode-se obter a actual sujidade numa variável. One-liner:

set a=%cd%

Verificar com

echo %a%
2
2
2
2016-10-10 02:11:12 +0000

apenas simples

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

Tenha cuidado com a barra invertida do fim do caminho, não tem de ser a barra invertida do fim.

1
1
1
2011-12-07 18:59:40 +0000

A minha resposta em este tópico fá-lo em 3 linhas 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
1
1
2015-05-28 16:08:10 +0000

Isto funciona para mim a partir de um ficheiro de lote. Devolve o nome do directório de trabalho actual.

pushd %1 & for %%i in (.) do @echo %%~ni