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

151

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

c: \ temp \ test.cmd >> test.cmd

PS Mój aktualny katalog! = Folder skryptu.

Mike Chaliy
źródło

Odpowiedzi:

310

Jako nazwę folderu i dysk możesz użyć:

echo %~dp0

Możesz uzyskać znacznie więcej informacji za pomocą 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 kopia wklejana z „for /?” polecenie w monicie. Mam nadzieję, że to pomoże.

Związane z

10 najlepszych wskazówek dotyczących partii DOS (Tak, partia DOS ...) pokazuje batchparams.bat (link do źródła jako sedno):

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
Wadih M.
źródło
Chłodny. Czy potrzebuję określonego wyniku, aby zmodyfikować post na wiki innej osoby?
Wadih M.
@Wadih M .: Ogólnie przydatne stackoverflow.com/questions/18557/ ...
jfs
@Wadih M .: W szczególności stackoverflow.com/questions/130654/ ...
jfs
@Wadih M .: Z powyższego linku: „+750 do edytowania postów społeczności„ edytowalne ”wiki”
jfs
Więc jeśli chcesz, aby skrypt cmd ustawił katalog roboczy na lokalizację skryptu: cd /d "%~dp0"(ze stackoverflow.com/questions/4451668 )
Nigel Touch
52

Zaakceptowana odpowiedź jest pomocna, ale nie jest od razu oczywiste, jak pobrać nazwę pliku ze ścieżki, jeśli NIE używasz przekazanych wartości. 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 :file_name_from_pathfunkcja może być używana w dowolnym miejscu do pobrania wartości, a nie tylko do przekazanych argumentów. Może to być niezwykle pomocne, jeśli argumenty mogą być przekazywane do pliku w nieokreślonej kolejności lub ścieżka nie jest w ogóle przekazywana do pliku.

NightOwl888
źródło
łał, to niesamowite! Więc pliki wsadowe systemu Windows obsługują funkcję w tym samym pliku, jak przydatne! Od kiedy było to możliwe?
Łukasz
2
Podoba mi się, że możesz przekazywać zmienne zarówno przez odniesienie (takie, jakie jest), jak i przez wartość (otoczone znakami „!”). Ok, prawdopodobnie nie masz zmiennych „lokalnych” i stosu wywołań ... ale hej: w końcu to skrypt cmd, i tak jest to duży krok naprzód;) Zgadzam się, partycjonowanie rzeczy w jednym pliku jest znacznie wygodniejsze niż podzielenie go na kilka plików :)
Luke
1
Myślę, że „goto: eof” powinno być „goto eof” .. bez okrężnicy .. ponieważ mnie łamało.
A Khudairy
2
Zobacz też: ss64.com/nt/syntax-args.html - użyj tylko %~dp1dla dysku i ścieżki.
Andrew
2
@AKhudairy jest poprawne: ss64.com/nt/goto.html Z dwukropkiem goto pomija endlocal (i wszystko inne, co wstawisz później, na przykład pauzę). Musisz także dodać "s wokół, !myPath!jeśli twoja ścieżka zawiera spacje (lub aby cytaty były częścią myPath)
Rick,
8

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

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

Wtedy nie powinieneś mieć żadnych problemów.

Szczery
źródło
5

Gdyby ktoś chciał alternatywnej metody ...

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

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

Zwróciłoby to:

c:\directory\subdirectory

.... wraca do poprzedniego katalogu. / ad pokazuje tylko katalogi / b jest listą w nagim formacie / s zawiera wszystkie podkatalogi. Służy do uzyskania pełnej ścieżki katalogu do wydrukowania.

znak
źródło
Prawdopodobnie działa w odniesieniu do bieżącego katalogu, a nie katalogu, w którym znajduje się plik skryptu.
Mike Chaliy
4

Miałem ten sam problem w mojej pętli, w której 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 to pełna ścieżka do pliku, a% ii \ .. po prostu zwraca folder nadrzędny.

mam nadzieję, że to pomoże.

Gico
źródło
Szybko i brudno. Lubię to! Nigdy nie myślałem, że rozszerzysz ścieżkę do pliku za pomocą „\ ..” i skończysz na folderze nadrzędnym.
Oliver R.
To zadziałało dla mnie na Win10: FOR / R "C: \ sourceDir"% I IN (* .gz) DO C: \ 7-Zip64 \ 7z.exe x "% I" -aou -o% I \ .. \
b3wii
Tak! To rozwiązuje problem polegający na tym, że% ~ dp1 (itd.) Działa tylko na% 0,% 1,% 2 itd.
Artelius
3

Jeśli zaakceptowana odpowiedź Wadiha nie działa dla Ciebie, spróbuj echo %CD%

Naguib Ihab
źródło
0

Zostało to połączone z edytowanym przykładem cmd

@Echo off

Echo ********************************************************
Echo *  ZIP Folder Backup using 7Zip                        *
Echo *  Usage: Source Folder, Destination Drive Letter      *
Echo *  Source Folder will be Zipped to Destination\Backups *
Echo ********************************************************
Echo off

set year=%date:~-4,4%
set month=%date:~-10,2%
set day=%date:~-7,2%
set hour=%time:~-11,2%
set hour=%hour: =0%
set min=%time:~-8,2%

SET /P src=Source Folder to Backup: 
SET source=%src%\*
call :file_name_from_path nam %src%
SET /P destination=Backup Drive Letter:
set zipfilename=%nam%.%year%.%month%.%day%.%hour%%min%.zip
set dest="%destination%:\Backups\%zipfilename%"


set AppExePath="%ProgramFiles(x86)%\7-Zip\7z.exe"
if not exist %AppExePath% set AppExePath="%ProgramFiles%\7-Zip\7z.exe"

if not exist %AppExePath% goto notInstalled

echo Backing up %source% to %dest%

%AppExePath% a -r -tzip %dest% %source%

echo %source% backed up to %dest% is complete!

TIMEOUT 5

exit;

:file_name_from_path <resultVar> <pathVar>
(
    set "%~1=%~nx2"
    exit /b
)


:notInstalled

echo Can not find 7-Zip, please install it from:
echo  http://7-zip.org/

:end
PAUSE
Steve Seymour
źródło