Obter o nome da pasta atual por um comando do DOS?

60

É possível obter o nome da pasta atual (não o caminho do diretório atual) usando um comando do DOS? Se sim, como?

O mais próximo que cheguei foi isso, mas não o faz:

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

nota: a tentativa acima foi eu tentando tokenizar a string e obter o último token definido como a variável CURR.

djangofan
fonte
Se você tem algum tipo de conjunto de ferramentas GNU instalado, deve poder ir cd | sed "s/.*\\//"(Isso direciona a saída do cd (cwd) para uma pesquisa de expressão regular e substitui, substituindo tudo antes do final \ com nada)
Phoshi
2
Eu preciso evitar as ferramentas GNU para que o arquivo em lotes funcione em qualquer lugar para qualquer pessoa. Minha pergunta é para "DOS puro" de qualquer maneira.
djangofan
Tudo bem. Um rápido google mostrou um resultado SO para implementar a pesquisa de regex e substituir no VBScript ( stackoverflow.com/questions/127318/… ) que poderia usar a mesma sintaxe e criar o mesmo resultado - acredito que o VBScript tenha sido incorporado desde o Windows 98, portanto deve estar em qualquer lugar para todos! (Você também pode rejigger muito facilmente-lo para o trabalho no OS * nix', também)
Phoshi
3
Para sua informação, for /fnem o TomWij %~n*são suportados no MS-DOS. (Windows' cmd.exeé não DOS, que é um programa nativo do Windows.)
grawity

Respostas:

85

A maneira mais curta que encontrei:

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

ou dentro de um script .bat:

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

ou em .bat com Get value na variável

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

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

nx significa apenas o nome e a extensão do arquivo

Tamara Wijsman
fonte
Eu gosto do link e da sugestão, mas quando coloco isso em um arquivo em lotes, recebo um fechamento imediato do shell sem saída. deve haver um erro de sintaxe em algum lugar?
djangofan
3
O exemplo funcionará na linha de comando interativamente. Para usá-lo em um arquivo em lotes, é necessário substituir todas as ocorrências %por %%.
Mike Fitzpatrick
2
Além disso, o exemplo não trata corretamente os nomes de pastas que contêm um ponto ( .), como minha pasta% USERPROFILE%.
Mike Fitzpatrick
1
Sim, funciona se você substituir '%' por '%%'. Boa resposta. Teria sido a resposta aceita se isso fosse observado anteriormente.
djangofan
1
Qualquer que seja essa feitiçaria maligna, estou feliz que funcione. Eu estou familiarizado com a maioria da expansão-sintaxe, mas eu nunca vi *usado com ele antes oo
kayleeFrye_onDeck
30

Se você quiser saber a localização atual do arquivo em lotes (e se o Windows não for uma versão muito antiga), digite for /?uma janela na 'caixa do DOS'. Rolar para baixo. Ler.

Você descobrirá que agora pode ler (de dentro do arquivo em lotes) 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 ...]

Isso funciona para muitos casos. Suponha que o batchfile seja chamado mytest.bat. Você pode chamá-lo de diferentes maneiras:

  1. ..\..\to\mytest.bat ............................... (caminho relativo)
  2. d:\path\to\mytest.bat........................... (caminho completo)
  3. \\fileserver\sharename\mytest.bat... (caminho no compartilhamento remoto)

... e você sempre obterá o valor certo em suas variáveis.

Kurt Pfeifle
fonte
1
uau, curiosamente, você está certo. o comando "eco% ~ dp0" também resolve meu problema e é mais elegante.
precisa saber é o seguinte
5
Ok então - gostaria de me dar um '+1' então?
Kurt Pfeifle
Não, pelo motivo de 'for /?' foi o primeiro lugar óbvio que procurei e, portanto, essa resposta não é melhor do que o esperado por qualquer pessoa.
djangofan
4
@djangofan: Então você diz 'Uau, curiosamente, você está certo ...' a algo que você já sabia ?! Para uma resposta que não contribuiu para o seu conhecimento? (Você sabe, '+1' é clicando no ^ -arrow - é diferente de fazer uma resposta a um aceitado ....)
Kurt Pfeifle
1
parece que o último deveria ser %~dpnx0, não é?
luc
15

Eu pessoalmente gostei da resposta do Toms, até que ela lutou com pontos nos nomes dos dir. Isso me deu uma dica:

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

A resposta de Tom é boa, mas se você tiver um nome de diretório com um ponto final (por exemplo, wxwidgets-2.9.4), apenas o nome completo será obtido. Portanto, isso produziria o wxwidgets-2.9, porque o .4 foi tratado como uma extensão (Sim, mesmo que seja um nome de diretório!).

Para obter o nome completo da saída, você deve adicionar a extensão até o final:

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

e no modo de arquivo em lote:

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

Ou, é claro, defina uma variável no arquivo em lotes:

FOR %%I IN (.) DO SET CurrentD=%%~nI%%~xI
Brian Sidebotham
fonte
4

Uma outra maneira é:

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

trabalha com "." e espaços no nome do caminho

O que isso faz?

  1. coloque o nome do arquivo inteiro (driveletter-path-filename-extension) no MyPathVar

  2. remover nome do arquivo e extensão de MyPathvar

Também funciona com caminhos UNC. Se você precisar da barra invertida no final do caminho. Remova o \after MyPathno segundo comando set, por exemplo.

set "MyPath=%%MyPath:%~nx0=%%"
lenz
fonte
1
Então, como isso é diferente%~dp0
Amit Naidu
4

Você pode obter o diretório atual em uma variável. Uma linha:

set a=%cd%

Verificar com

echo %a%
vera
fonte
6
Ele quer o nome do diretório atual, não o caminho inteiro, e como um CD ==, você também pode usar% cd%.
Paradroid
2

simples

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

ou

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

Cuidado com a barra invertida do final do caminho, pois não deve ser a barra invertida do fim.

kygg
fonte
1

Minha resposta neste tópico faz isso 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
djangofan
fonte
1

Isso funciona para mim a partir de um arquivo em lotes. Retorna o nome do diretório de trabalho atual.

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