Czy chcesz uzyskać nazwę bieżącego folderu za pomocą polecenia DOS?

58

Czy można uzyskać nazwę bieżącego folderu (nie bieżącą ścieżkę katalogu) za pomocą polecenia DOS? Jeśli tak to jak?

Najbliżej było to, ale to nie robi:

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

Uwaga: powyższa próba polegała na tym, że próbowałem tokenizować ciąg i uzyskać ostatni zestaw tokenów jako zmienną CURR.

djangofan
źródło
Jeśli masz zainstalowany jakikolwiek zestaw narzędzi GNU, powinieneś być w stanie przejść cd | sed "s/.*\\//"(To potokuje wyjście cd (cwd) do wyszukiwania wyrażeń regularnych i zamienia, zastępując wszystko przed końcem \ niczym)
Phoshi
2
muszę unikać narzędzi GNU, aby plik wsadowy działał w dowolnym miejscu dla każdego. W każdym razie moje pytanie dotyczy „czystego DOS”.
djangofan,
W porządku. Szybkie google pokazało wynik SO dla implementacji wyszukiwania wyrażeń regularnych i zamiany w VBScript ( stackoverflow.com/questions/127318/... ), który mógłby użyć tej samej składni i stworzyć ten sam wynik - Wierzę, że VBScript został wbudowany od Windows 98, więc powinno być wszędzie dla każdego! (Mógłbyś też bardzo łatwo ponownie uruchomić go do pracy na * nix OS ')
Phoshi
3
FYI, for /fani TomWij nie %~n*są obsługiwane w MS-DOS. (Windows ' cmd.exeto nie DOS, to natywny program Windows.)
grawity

Odpowiedzi:

83

Najkrótsza droga, jaką znalazłem:

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

lub w skrypcie .bat:

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

lub w .bat z Uzyskaj wartość w zmiennej.

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

Objaśnienie: http://www.robvanderwoude.com/ntfor.php

nx oznacza tylko nazwę pliku i rozszerzenie

Tamara Wijsman
źródło
Podoba mi się link i sugestia, ale kiedy umieszczam to w pliku wsadowym, natychmiast uzyskuję natychmiastowe zamknięcie powłoki bez wyjścia. gdzieś tam musi być błąd składniowy?
djangofan,
3
Przykład będzie działał interaktywnie w wierszu poleceń. Aby użyć go w pliku wsadowym trzeba zastąpić wszystkie wystąpienia %z %%.
Mike Fitzpatrick
2
Ponadto przykład nie obsługuje poprawnie nazw folderów zawierających kropkę ( .), takich jak mój folder% USERPROFILE%.
Mike Fitzpatrick
1
Tak, działa, jeśli zamienisz „%” na „%%”. Niezła odpowiedź. Byłaby to zaakceptowana odpowiedź, gdyby zostało to odnotowane wcześniej.
djangofan
1
Czymkolwiek jest ta okropna zła magia, cieszę się, że działa. Znam większość składni ekspansji, ale nigdy wcześniej nie widziałem jej *użycia
kayleeFrye_onDeck 20.04.2018
30

Jeśli chcesz poznać bieżącą lokalizację pliku wsadowego (i jeśli twój system Windows nie jest bardzo starą wersją), wpisz for /?okno „DOS box”. Przewiń w dół. Czytać.

Dowiesz się, że można teraz czytać (od wewnątrz pliku wsadowego) tych zmiennych:

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

Działa to w wielu przypadkach. Załóżmy, że plik wsadowy jest nazywany mytest.bat. Możesz to nazwać na różne sposoby:

  1. ..\..\to\mytest.bat ............................... (ścieżka względna)
  2. d:\path\to\mytest.bat........................... (pełna ścieżka)
  3. \\fileserver\sharename\mytest.bat... (ścieżka do zdalnego udostępniania)

... i zawsze otrzymasz odpowiednią wartość w swoich zmiennych.

Kurt Pfeifle
źródło
1
wow, co ciekawe, masz rację. polecenie „echo% ~ dp0” rozwiązuje również mój problem i jest bardziej elegancki.
djangofan,
5
Ok, więc - chcesz w takim razie przyznać mi +1?
Kurt Pfeifle,
Nie, z tego powodu, że „for /?” było oczywiste pierwsze miejsce, na które patrzyłem, więc ta odpowiedź nie jest lepsza niż oczekiwana przez kogokolwiek.
djangofan
4
@djangofan: Więc mówisz „Wow, co ciekawe, masz rację ...” do czegoś, co już wiedziałeś ?! Na odpowiedź, która nie przyczyniła się do twojej wiedzy? (Wiesz, „+1” klika strzałkę ^ - różni się to od udzielenia odpowiedzi zaakceptowanej ....)
Kurt Pfeifle
1
wydaje się, że ostatni powinien być %~dpnx0, prawda?
luc
15

Osobiście podobała mi się odpowiedź Toma, dopóki nie zmagała się z kropkami w nazwach reż. To dało mi wskazówkę:

for /f "delims=\" %%a in ("%cd%") do echo topmost dir: %%~nxa
Marc Wittke
źródło
5

Odpowiedź Toma jest dobra, ale jeśli masz nazwę katalogu z kropką (tj. Wxwidgets-2.9.4), otrzymasz tylko pełną nazwę. Wynikiem tego byłby wynik wxwidgets-2.9, ponieważ .4 został potraktowany jako rozszerzenie (Tak, mimo że jest to nazwa katalogu!).

Aby uzyskać pełną nazwę wyjściową, musisz dodać rozszerzenie na końcu:

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

oraz w trybie pliku wsadowego:

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

Lub, zamiast tego, ustaw zmienną w pliku wsadowym:

FOR %%I IN (.) DO SET CurrentD=%%~nI%%~xI
Brian Sidebotham
źródło
4

Innym sposobem jest:

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

działa z „.” i spacje w nazwie ścieżki

Co to robi?

  1. umieść całą nazwę pliku (driveelet-path-filename-extension) w MyPathVar

  2. usuń nazwę pliku i rozszerzenie z MyPathvar

Działa również ze ścieżkami UNC. Jeśli potrzebujesz ukośnika na końcu ścieżki. Usuń \po MyPathw drugim poleceniu set, np.

set "MyPath=%%MyPath:%~nx0=%%"
lenz
źródło
1
Czym więc to się różni od%~dp0
Amit Naidu
4

Możesz przekształcić bieżący katalog w zmienną. Jednowarstwowy:

set a=%cd%

Sprawdź z

echo %a%
Vera
źródło
6
Chce bieżącej nazwy katalogu, a nie całej ścieżki, a jako == cd równie dobrze możesz użyć% cd%.
paradroid
2

poprostu

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

lub

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

Uważaj na odwrotny koniec końca ścieżki, nie musi to być odwrotny koniec końca.

kygg
źródło
1

Moja odpowiedź w tym wątku składa się z 3 prostych linii:

@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
źródło
1

To działa dla mnie z pliku wsadowego. Zwraca bieżącą nazwę katalogu roboczego.

pushd %1 & for %%i in (.) do @echo %%~ni
nem50
źródło