Отримайте поточний каталог batchfile


283

По-перше, я бачив цю тему, але не зміг її зрозуміти.

Питання:

Є пакетний файл D:\path\to\file.batіз таким вмістом:

echo %cd%
pause

Вихід:

C:\

Це повинно бути D:\path\to

Що я роблю неправильно?


7
Ви повинні прочитати всі відповіді на запитання, особливо вищі учасники голосування, а не лише прийняті. Відповідь з найбільшою оцінкою за розміщеним посиланням вже відповідає на ваше запитання.
dbenham

4
Якщо ви знаходитесь в c: \, коли ви вводите назву пакетного файлу, тоді c: \ буде надрукувати% cd%.
foxidrive

Відповіді:


496

Системна змінна лише для читання %CD%зберігає шлях виклику партії, а не розташування пакетного файлу.

Ви можете отримати ім'я самого пакетного сценарію, як його вводить користувач %0(наприклад scripts\mybatch.bat). До цього можна застосувати розширення параметрів, тому %~dp0вони повернуть Диск та Шлях до пакетного сценарію (наприклад W:\scripts\) та %~f0повернуть повне ім'я шляху (наприклад W:\scripts\mybatch.cmd).

Ви можете звернутися до інших файлів у тій самій папці, що й пакетний сценарій, використовуючи цей синтаксис:

CALL %0\..\SecondBatch.cmd

Це навіть можна використовувати в підпрограмі, Echo %0дасть мітку виклику, але echo "%~nx0"дасть вам ім'я файлу пакетного сценарію.

Коли %0змінна розширюється, результат укладається в лапки.

Детальніше про параметри партії .


1
Дивись, мені не потрібно бігти stm.sqlв D:\Dir1\Dir2\stm.sql. Мені потрібно mysql.exe -u root -p mysql < %cd%\stm.sqlвиконати ці stm.sql команди.
Хамед Камрава

@HamedKamrava це для моєї партії SQL? не пакетний файл, як *.batабо *.sh?
Stoleg

@ Stoleg- Насправді, у 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.
Хамед Камрава

1
Системна змінна% CD% зберігає шлях виклику партії, а не розташування пакетного файлу.
Stoleg

34
echo %~dp0поверне шлях до місця розташування. echo %~f0поверне шлях до партії з ім'ям файлу.
Stoleg

119

Дуже просто:

setlocal
cd /d %~dp0
File.exe

9
Код короткий, але його не просто зрозуміти. Що це за файл File.exe? Чи зберігається поточний шлях до каталогу у% ~ dp0?
Іваїло Бардаров

Ця відповідь фактично відповідає на питання, я думаю. Кудос.
macetw

3
Я щойно використовував cd /d %~dp0як перший рядок пакетного файлу і працював
mkb

навіщо потрібен сетлокал? це добре повертається і без цього теж?
Т.Тодуа

1
@ T.Todua "setlocal" викликає будь-які зміни середовища, включаючи поточний каталог, або міститись до тих пір, поки не закінчиться пакетний файл або не зустрінеться "endlocal". Якщо ви збираєтеся змінити змінні середовища чи поточний каталог, це добре.
Джеймі

30

У вашому файлі .bat:

set mypath=%cd%

Тепер ви можете використовувати змінну %mypath%для посилання шляху до .batфайлу. Щоб перевірити правильність шляху:

@echo %mypath%

Наприклад, викликається файл DIR.batіз наступним вмістом

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

Запустити з каталогу, g:\test\batбуде повторювати цей шлях у вікні команди DOS.


1
це найкраще і найпростіше рішення
Нані

7
Це не гарне рішення, оскільки воно не враховує виклик пакетного сценарію з іншого файлу іншим шляхом.
ПитанняМай

також при запуску як підвищені дозволи,% cd% повертає C: \ Windows \ system32, але не каталог, де він зберігається.
PravyNandas

9

Ось що я використовую вгорі всіх своїх пакетних файлів. Я просто копіюю / вставляю з моєї папки шаблонів.

@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 робить це і багато іншого.


2
Чудова відповідь, велике спасибі! :-) Просто остерігайся своєї другої техніки ( set batdir=%CD%). Це не нормально, тому що це шлях до абонента, а не сам файл bat. Єдиний вірний спосіб отримати шлях до виконуваного файлу bat %~dp0.
Мітч Макмаберс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.