Pobierz bieżący katalog plików wsadowych

283

Po pierwsze widziałem ten temat, ale nie mogłem tego zrozumieć.

Pytanie:

Plik wsadowy D:\path\to\file.batzawiera następującą treść:

echo %cd%
pause

Dane wyjściowe to:

C:\

To musi być D:\path\to

Co ja robię źle?

Hamed Kamrava
źródło
7
Powinieneś przeczytać wszystkie odpowiedzi na pytanie, zwłaszcza osoby, które zdobywają więcej głosów, nie tylko te zaakceptowane. Odpowiedź z najwyższym wynikiem na opublikowanym linku już odpowiada na twoje pytanie.
dbenham
4
Jeśli wpisujesz nazwę pliku wsadowego w c: \, to c: \ zostanie wydrukowane przez% cd%.
foxidrive

Odpowiedzi:

496

Systemowa zmienna tylko do odczytu %CD% utrzymuje ścieżkę wywołującą partia, a nie lokalizację pliku wsadowego.

Możesz uzyskać nazwę samego skryptu wsadowego wpisaną przez użytkownika za pomocą %0(np scripts\mybatch.bat.). Można do tego zastosować rozszerzenia parametrów, więc %~dp0zwróci Dysk i Ścieżkę do skryptu wsadowego (np. W:\scripts\) I %~f0zwróci pełną nazwę ścieżki (np.W:\scripts\mybatch.cmd .).

Możesz odwoływać się do innych plików w tym samym folderze co skrypt wsadowy, używając następującej składni:

CALL %0\..\SecondBatch.cmd

Można tego użyć nawet w podprogramie, Echo %0nada etykietę wywołania, ale echo "%~nx0"poda nazwę pliku skryptu wsadowego.

Po %0rozwinięciu zmiennej wynik jest ujęty w cudzysłów.

Więcej na temat parametrów partii .

Stoleg
źródło
1
Wygląd, nie trzeba uruchamiać stm.sqlw D:\Dir1\Dir2\stm.sql. Muszę mysql.exe -u root -p mysql < %cd%\stm.sqlwykonać polecenia stm.sql.
Hamed Kamrava
@HamedKamrava czy to moja partia SQL? nie plik wsadowy jak *.batlub *.sh?
Stoleg
@ Stoleg- W rzeczywistości istnieją 2 pliki w D:\Dir1\Dir2\batchfile.bati D:\Dir1\Dir2\stm.sql. Plik batchfile.bat to: mysql.exe -u root -p mysql < D:\Dir1\Dir2\stm.sqla zawartość stm.sql to niektóre polecenia MySQL.
Hamed Kamrava
1
Systemowa zmienna tylko do odczytu% CD% utrzymuje ścieżkę wywołującą partia, a nie lokalizację pliku wsadowego.
Stoleg
34
echo %~dp0zwróci ścieżkę do lokalizacji partii. echo %~f0zwróci ścieżkę do partii z nazwą pliku.
Stoleg
119

Bardzo prosty:

setlocal
cd /d %~dp0
File.exe
Shay
źródło
9
Kod jest krótki, ale nie jest łatwy do zrozumienia. Co to jest File.exe? Czy bieżąca ścieżka do katalogu jest przechowywana w% ~ dp0?
Ivailo Bardarov,
Myślę, że ta odpowiedź faktycznie odpowiada na pytanie. Sława.
macetw
3
Właśnie użyłem cd /d %~dp0jako pierwszego wiersza pliku wsadowego i zadziałałem
mkb
dlaczego potrzebujesz setlocal? bez tego też dobrze wraca?
T.Todua
1
@ T.Todua „setlocal” powoduje, że wszelkie zmiany środowiska, w tym bieżący katalog, zostaną zawarte do momentu zakończenia pliku wsadowego lub napotkania „endlocal”. Jeśli zamierzasz zmienić zmienne środowiskowe lub bieżący katalog, jest to dobra forma.
Jamie
30

W pliku .bat:

set mypath=%cd%

Teraz możesz użyć tej zmiennej, %mypath%aby odwoływać się do ścieżki pliku do .batpliku. Aby sprawdzić, czy ścieżka jest poprawna:

@echo %mypath%

Na przykład plik DIR.bato następującej treści

set mypath=%cd%
@echo %mypath%
Pause

g:\test\batUruchom z katalogu spowoduje wyświetlenie echa tej ścieżki w oknie poleceń DOS.

rockerron
źródło
1
to najlepsze i najprostsze rozwiązanie
Nani
7
To nie jest dobre rozwiązanie, ponieważ nie uwzględnia skryptu wsadowego wywoływanego z innego pliku na innej ścieżce.
theQuestionMan
również, gdy jest uruchamiany z podwyższonymi uprawnieniami,% cd% zwraca C: \ Windows \ system32, ale nie katalog, w którym jest przechowywany.
PravyNandas
9

Oto, czego używam na górze wszystkich moich plików wsadowych. Po prostu kopiuję / wklejam z mojego folderu szablonów.

@echo off
:: --HAS ENDING BACKSLASH
set batdir=%~dp0
:: --MISSING ENDING BACKSLASH
:: set batdir=%CD%
pushd "%batdir%"

Ustawienie ścieżki bieżącego pliku wsadowego na% batdir% pozwala wywoływać go w kolejnych stmts w bieżącym pliku wsadowym, niezależnie od tego, gdzie zmieni się ten plik wsadowy. Użycie PUSHD pozwala na użycie POPD do szybkiego ustawienia ścieżki tego pliku wsadowego na oryginalny% batdir%. Pamiętaj, że jeśli używasz% batdir% ExtraDir lub% batdir% \ ExtraDir (w zależności od wersji użytej powyżej, kończąc odwrotnym ukośnikiem, czy nie), musisz zawrzeć cały ciąg w cudzysłowie, jeśli ścieżka zawiera spacje (tj. „% Batdir% ExtraDir” ). Zawsze możesz użyć PUSHD% ~ dp0. [https: // ss64.com/ nt / syntax-args .html] ma więcej parametrów (% ~).

Zauważ, że użycie (: :) na początku linii powoduje, że jest to linia komentarza. Co ważniejsze, użycie :: pozwala na włączenie w tym komentarzu przekierowań, potoków, znaków specjalnych (tj. <> | Itd.).

:: ORIG STMT WAS: dir *.* | find /v "1917" > outfile.txt

Oczywiście Powershell robi to i wiele więcej.

Wendell Holmes
źródło
2
Świetna odpowiedź, wielkie dzięki! :-) Uważaj tylko na swoją drugą technikę ( set batdir=%CD%). Nie jest to w porządku, ponieważ jest to ścieżka do dzwoniącego, a nie sam plik nietoperza. Jedynym prawidłowym sposobem uzyskania ścieżki do wykonującego się pliku nietoperza jest %~dp0.
Mitch McMabers