Получить текущий каталог пакетных файлов

283

Во-первых, я видел эту тему, но я не мог этого понять.

Вопрос:

Существует пакетный файл D:\path\to\file.batсо следующим содержимым:

echo %cd%
pause

Выход:

C:\

Это должно быть D:\path\to

Что я делаю не так?

Хамед Камрава
источник
7
Вы должны прочитать все ответы на вопрос, особенно получатели более высоких голосов, а не только принятые. Ответ с наибольшим количеством баллов по вашей опубликованной ссылке уже отвечает на ваш вопрос.
ДБЕНХАМ
4
Если при вводе имени пакетного файла вы находитесь в c: \, то c: \ - это то, что% cd% напечатает.
foxidrive

Ответы:

497

Системная переменная только для чтения %CD%хранит путь к вызывающей стороне пакета, а не местоположение файла пакета.

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

Вы можете ссылаться на другие файлы в той же папке, что и пакетный скрипт, используя этот синтаксис:

CALL %0\..\SecondBatch.cmd

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

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

Подробнее о параметрах партии .

Stoleg
источник
1
Смотри, мне не нужно бежать stm.sqlв D:\Dir1\Dir2\stm.sql. Мне нужно mysql.exe -u root -p mysql < %cd%\stm.sqlвыполнить команды stm.sql.
Хамед Камрава
@HamedKamrava это для моего пакета SQL? не пакетный файл, как *.batили *.sh?
Стелег
@ Stoleg- На самом деле, есть 2 файла D:\Dir1\Dir2\batchfile.batи D:\Dir1\Dir2\stm.sql. Содержимое batchfile.bat: mysql.exe -u root -p mysql < D:\Dir1\Dir2\stm.sqlи содержимое stm.sql - это некоторые команды MySQL.
Хамед Камрава
1
Системная переменная только для чтения% CD% сохраняет путь к вызывающей стороне пакета, а не местоположение файла пакета.
Stoleg
35
echo %~dp0вернет путь к местоположению партии. echo %~f0вернет путь к пакету с именем файла.
Stoleg
119

Очень просто:

setlocal
cd /d %~dp0
File.exe
фаэтон
источник
9
Код короткий, но его непросто понять. Что это за File.exe? Текущий путь к каталогу хранится в% ~ dp0?
Ивайло Бардаров
Этот ответ на самом деле отвечает на вопрос, я думаю. Престижность.
macetw
3
Я просто использовал в cd /d %~dp0качестве первой строки командный файл и работал
MKB
зачем нужен setlocal? это хорошо возвращается без этого тоже?
Т.Тодуа
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.

rockerron
источник
1
это самое прекрасное и простое решение
Нани,
7
Это не очень хорошее решение, поскольку оно не учитывает пакетный скрипт, вызываемый из другого файла по другому пути.
TheMuestionMan
также при запуске с повышенными правами% 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.
Митч МакМаберс