По-перше, я бачив цю тему, але не зміг її зрозуміти.
Питання:
Є пакетний файл D:\path\to\file.bat
із таким вмістом:
echo %cd%
pause
Вихід:
C:\
Це повинно бути D:\path\to
Що я роблю неправильно?
По-перше, я бачив цю тему, але не зміг її зрозуміти.
Питання:
Є пакетний файл D:\path\to\file.bat
із таким вмістом:
echo %cd%
pause
Вихід:
C:\
Це повинно бути D:\path\to
Що я роблю неправильно?
Відповіді:
Системна змінна лише для читання %CD%
зберігає шлях виклику партії, а не розташування пакетного файлу.
Ви можете отримати ім'я самого пакетного сценарію, як його вводить користувач %0
(наприклад scripts\mybatch.bat
). До цього можна застосувати розширення параметрів, тому %~dp0
вони повернуть Диск та Шлях до пакетного сценарію (наприклад W:\scripts\
) та %~f0
повернуть повне ім'я шляху (наприклад W:\scripts\mybatch.cmd
).
Ви можете звернутися до інших файлів у тій самій папці, що й пакетний сценарій, використовуючи цей синтаксис:
CALL %0\..\SecondBatch.cmd
Це навіть можна використовувати в підпрограмі, Echo %0
дасть мітку виклику, але echo "%~nx0"
дасть вам ім'я файлу пакетного сценарію.
Коли %0
змінна розширюється, результат укладається в лапки.
stm.sql
в D:\Dir1\Dir2\stm.sql
. Мені потрібно mysql.exe -u root -p mysql < %cd%\stm.sql
виконати ці stm.sql команди.
*.bat
або *.sh
?
D:\Dir1\Dir2\batchfile.bat
та 2 файлах є D:\Dir1\Dir2\stm.sql
. Зміст batchfile.bat - це: mysql.exe -u root -p mysql < D:\Dir1\Dir2\stm.sql
а вміст stm.sql - це деякі команди MySQL.
echo %~dp0
поверне шлях до місця розташування. echo %~f0
поверне шлях до партії з ім'ям файлу.
Дуже просто:
setlocal
cd /d %~dp0
File.exe
cd /d %~dp0
як перший рядок пакетного файлу і працював
У вашому файлі .bat:
set mypath=%cd%
Тепер ви можете використовувати змінну %mypath%
для посилання шляху до .bat
файлу. Щоб перевірити правильність шляху:
@echo %mypath%
Наприклад, викликається файл DIR.bat
із наступним вмістом
set mypath=%cd%
@echo %mypath%
Pause
Запустити з каталогу, g:\test\bat
буде повторювати цей шлях у вікні команди DOS.
Ось що я використовую вгорі всіх своїх пакетних файлів. Я просто копіюю / вставляю з моєї папки шаблонів.
@echo off
:: --HAS ENDING BACKSLASH
set batdir=%~dp0
:: --MISSING ENDING BACKSLASH
:: set batdir=%CD%
pushd "%batdir%"
Встановлення шляху поточного файлового файлу до% batdir% дозволяє викликати його в наступних stmts у поточному пакетному файлі, незалежно від того, куди цей пакетний файл змінюється. Використання PUSHD дозволяє використовувати POPD для швидкого встановлення шляху цього пакетного файлу до початкового% batdir%. Пам'ятайте, що якщо ви використовуєте% batdir% ExtraDir або% batdir% \ ExtraDir (залежно від того, яка версія використовується вище, закінчуючи зворотній косою рисою чи ні), вам потрібно буде скласти всю рядок у подвійні лапки, якщо шлях має пробіли (тобто "% batdir% ExtraDir" ). Ви завжди можете використовувати PUSHD% ~ dp0. [https: // ss64.com/ nt / syntax-args .html] містить більше (% ~) параметрів.
Зауважте, що використання (: :) на початку рядка робить це коментованим рядком. Що ще важливіше, використання :: дозволяє включити до цього коментаря переспрямовувачі, труби, спеціальні символи (тобто <> | тощо).
:: ORIG STMT WAS: dir *.* | find /v "1917" > outfile.txt
Звичайно, Powershell робить це і багато іншого.
set batdir=%CD%
). Це не нормально, тому що це шлях до абонента, а не сам файл bat. Єдиний вірний спосіб отримати шлях до виконуваного файлу bat %~dp0
.