Как получить путь к пакетному скрипту в Windows?

329

Я знаю, что %0содержит полный путь пакетного сценария, напримерc:\path\to\my\file\abc.bat

Я бы pathравнялсяc:\path\to\my\file

Как я мог этого достичь?

Миша Морошко
источник
1
Кстати:% 0 не содержит полный путь, если bat вызывается с помощью относительной командной строки. Так что «% ~ dpf0» будет более надежным для этого случая.
eckes

Ответы:

563

%~dp0будет каталог. Вот некоторая документация по всем модификаторам пути . Прикольные вещи :-)

Чтобы удалить последний обратный слеш, вы можете использовать :n,mсинтаксис подстроки, например:

SET mypath=%~dp0
echo %mypath:~0,-1%

Я не верю, что есть способ объединить %0синтаксис с :~n,mсинтаксисом, к сожалению.

Дин Хардинг
источник
7
Отлично ... Я использовал %~0\..- знал, что должен быть лучший способ! Кроме того, вы, вероятно, захотите заключить %~dp0в двойные кавычки ( ""), если в имени каталога есть пробелы и т. Д.
Кэмерон
1
Ницца ! Но, %~dp0содержит `` в конце. У тебя есть идея как это убрать?
Миша Морошко
1
@ Миша: я предполагаю, что вы имеете в виду, как удалить '\' на конце. Я обновил свой ответ с деталями.
Дин Хардинг
2
Пример в ответе работает нормально без кавычек, даже если в пути есть пробел. (например, SET msg=hello worldработает отлично). Однако, когда вы используете% mypath% в другом месте, вы должны быть осторожны, чтобы использовать его в кавычках, хотя они не нужны cdни для того, ни для другого.
Мартин Пейн
2
Эта ссылка теперь 404
StingyJack
12

Вы можете использовать следующий скрипт, чтобы получить путь без "\"

for %%i in ("%~dp0.") do SET "mypath=%%~fi"
дуань
источник
Это не удаляет имя файла из пути, хотя (например, abc.txt в примере OP).
DCP
4
@dcp Э-э, это так, хотя.
Кайл Стрэнд
@ Кайл Стрэнд - Да, я только что попробовал еще раз, и теперь он работает нормально. Я не уверен, что случилось, когда я попробовал это первоначально, возможно я допустил ошибку где-то в сценарии. Извините за путаницу, и спасибо за указание на это.
декабря
11

%~dp0может быть относительный путь. Чтобы преобразовать его в полный путь, попробуйте что-то вроде этого:

pushd %~dp0
set script_dir=%CD%
popd
Arnaud
источник
6
Хорошо, так почему бы не использовать %~dp0напрямую?
jpaugh
5
Хуже версия принятого ответа, опубликованная через 5 лет? Я не понимаю
Кайл Стрэнд
Я предполагаю, что это было отправлено, чтобы решить проблему, упомянутую в комментариях принятого ответа - %~dp0может быть относительным, который может или не может быть проблемой в зависимости от
Майкл
10
%~dp0не может содержать относительный путь, dобозначает диск и pпуть, как диск может быть относительным?
Джеб
5
В каком мире? Я только что проверил этот ответ на Windows Server 2012 r2, и оказалось, что %~dp0это будет абсолютный путь, даже если скрипт был запущен как относительный путь. Благодаря комментарию Джеба этот ответ меня не обманул. Почему люди просто придумывают вещи и уходят и начинают распространять свое дикое воображение на других. У меня есть коллега, который делает это, но я обвинил его (молодой) возраст. Я бы хотел, чтобы мой отрицательный голос был засчитан.
bitoolean
0

Вы можете использовать %~dp0, d означает только диск, p означает только путь, 0 - аргумент для полного имени файла командного файла.

Например, если путь к файлу был C: \ Users \ Oliver \ Desktop \ example.bat, тогда аргумент будет равен C: \ Users \ Oliver \ Desktop \, также вы можете использовать команду set cpath=%~dp0 && set cpath=%cpath:~0,-1%и использовать %cpath%переменную для удаления завершающего слеша.

Hayz
источник
1
Я не могу видеть больше информации, чем в 9 лет ответ
Джеб
Дополнительная информация: «d означает только диск,…» и т. Д. Спасибо, @Hayz.
RJ Dunnill
-2

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

Просто беги:

echo %cd%
Уддалак Бисвас
источник
%CD%текущая рабочая папка, а не папка, в которой хранится командный файл. Они могут быть в одном месте, но часто это не так.
Стефан
-7

Это было бы %CD%переменной.

@echo off
echo %CD%

%CD% возвращает текущий каталог, в котором находится пакетный скрипт.

Ruel
источник
35
% cd% возвращает каталог, из которого был запущен скрипт, а не каталог, в котором находится скрипт.
Миша Морошко
4
это работает, только если ваш скрипт не изменяет рабочий каталог. Попробуй CD C:\Temp <CR> ECHO %CD%( <CR>это новая строка ...)
Дин Хардинг
6
Кроме того, если вы щелкнете правой кнопкой мыши по сценарию и выберете «Запуск от имени администратора», начальным текущим каталогом будет C: \ Windows \ System32 независимо от того, где находится сценарий.
Кэмерон
Хотя это и не прямой ответ на вопрос OP, этот вид функциональности - именно то, что я искал, когда нашел этот вопрос. Спасибо!
Золтан
Ни одно из других опубликованных решений не работает для меня на Win7 32bit cmd.exe, по крайней мере, это полезно для меня.
Клиффорд
-8

Я работаю на компьютере с Windows 7, и в итоге я использовал строки ниже, чтобы получить абсолютный путь к папке для моего bash-скрипта.

Я попал к этому решению после просмотра http://www.linuxjournal.com/content/bash-parameter-expansion .

#Get the full aboslute filename.
filename=$0
#Remove everything after \. An extra \ seems to be necessary to escape something...
folder="${filename%\\*}"
#Echo...
echo $filename
echo $folder
Jonas
источник
2
ОП спрашивает о сценариях оболочки Windows BAT / CMD, а не bash.
Риви