Jak pobrać ścieżkę folderu ze ścieżki pliku za pomocą CMD

Potrzebuję ścieżki do folderu zawierającego plik cmd. Z %0 mogę pobrać nazwę pliku. Ale jak uzyskać nazwę folderu?

C:\temp\test.cmd > > test.cmd

P. S. mój aktualny katalog != folder skryptu.

 133
Author: Mike Chaliy, 2009-03-18

6 answers

Dla nazwy folderu i dysku można użyć:

echo %~dp0

Możesz uzyskać o wiele więcej informacji używając różnych modyfikatorów:

%~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

To jest Kopiuj Wklej z "dla /?"polecenie w wierszu polecenia. Mam nadzieję, że to pomoże.

Powiązane

Top 10 porad dos partii (tak, dos partii...) pokazuje batchparams.bat (link do źródła jako 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/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-05 19:46:45

Przyjęta odpowiedź jest pomocna, ale nie jest od razu oczywiste, jak pobrać nazwę pliku ze ścieżki, jeśli nie używasz wartości przekazywanych. Udało mi się to rozwiązać z tego wątku, ale na wypadek, gdyby inni nie mieli tyle szczęścia, oto jak to się robi: {]}

@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

Teraz funkcja :file_name_from_path może być używana wszędzie do pobierania wartości, nie tylko dla przekazywanych w argumentach. Może to być bardzo pomocne, jeśli argumenty mogą być przekazywane do pliku w nieokreślonej kolejności lub ścieżka nie jest / align = "left" /

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-08 16:48:34

Aby przypisać je do zmiennych, pamiętaj, aby nie dodawać spacji przed lub po znaku równości:

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

Więc nie powinieneś mieć żadnych problemów.

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-26 22:38:38

Na wypadek, gdyby ktoś chciał alternatywną metodę...

Jeśli jest to ostatni podkatalog w ścieżce, możesz użyć tego jednego wiersza:

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

Zwróci to następujące:

c:\directory\subdirectory

The .... wraca do poprzedniego katalogu. / reklama pokazuje tylko katalogi / b jest notowaniem gołym formatem / s zawiera wszystkie podkatalogi. Jest to używane do uzyskania pełnej ścieżki katalogu do wydruku.

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-29 16:40:17

Miałem ten sam problem w pętli, gdzie chciałem wyodrębnić pliki zip w tym samym katalogu, a następnie usunąć plik zip. Problem polegał na tym, że 7z wymaga folderu wyjściowego, więc musiałem uzyskać ścieżkę folderu KAŻDEGO pliku. Oto moje rozwiązanie:

FOR /F "usebackq tokens=1" %%i IN (`DIR /S/B *.zip` ) DO (
  7z.exe x %%i -aoa -o%%i\..
) 

% % i była pełną ścieżką nazwy pliku i %ii\.. po prostu zwraca folder nadrzędny.

Mam nadzieję, że to pomoże.
 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/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-11 09:53:11

W przypadku, gdy zaakceptowana odpowiedź przez Wadih nie działa dla ciebie, spróbuj 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/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-04 00:59:33