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?
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?
Odpowiedzi:
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.
stm.sqlw D:\Dir1\Dir2\stm.sql. Muszę mysql.exe -u root -p mysql < %cd%\stm.sqlwykonać polecenia stm.sql.
*.batlub *.sh?
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.
echo %~dp0zwróci ścieżkę do lokalizacji partii. echo %~f0zwróci ścieżkę do partii z nazwą pliku.
Bardzo prosty:
setlocal
cd /d %~dp0
File.exe
cd /d %~dp0jako pierwszego wiersza pliku wsadowego i zadziałałem
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.
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.
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.