Po pierwsze widziałem ten temat, ale nie mogłem tego zrozumieć.
Pytanie:
Plik wsadowy D:\path\to\file.bat
zawiera 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.bat
zawiera 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 %~dp0
zwróci Dysk i Ścieżkę do skryptu wsadowego (np. W:\scripts\
) I %~f0
zwró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 %0
nada etykietę wywołania, ale echo "%~nx0"
poda nazwę pliku skryptu wsadowego.
Po %0
rozwinięciu zmiennej wynik jest ujęty w cudzysłów.
stm.sql
w D:\Dir1\Dir2\stm.sql
. Muszę mysql.exe -u root -p mysql < %cd%\stm.sql
wykonać polecenia stm.sql.
*.bat
lub *.sh
?
D:\Dir1\Dir2\batchfile.bat
i D:\Dir1\Dir2\stm.sql
. Plik batchfile.bat to: mysql.exe -u root -p mysql < D:\Dir1\Dir2\stm.sql
a zawartość stm.sql to niektóre polecenia MySQL.
echo %~dp0
zwróci ścieżkę do lokalizacji partii. echo %~f0
zwróci ścieżkę do partii z nazwą pliku.
Bardzo prosty:
setlocal
cd /d %~dp0
File.exe
cd /d %~dp0
jako 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 .bat
pliku. Aby sprawdzić, czy ścieżka jest poprawna:
@echo %mypath%
Na przykład plik DIR.bat
o następującej treści
set mypath=%cd%
@echo %mypath%
Pause
g:\test\bat
Uruchom 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
.