Як отримати шлях пакетного сценарію в Windows?


329

Я знаю, що %0містить повний шлях пакетного сценарію, наприкладc:\path\to\my\file\abc.bat

Я хотів би pathбути рівнимc:\path\to\my\file

Як я міг цього досягти?




1
BTW:% 0 не містить повного шляху, якщо кажан викликається з відносним командним рядком. Тож "% ~ dpf0" був би надійнішим у цьому випадку.
eckes

Відповіді:


562

%~dp0буде каталог. Ось деяка документація щодо всіх модифікаторів шляху . Розваги :-)

Для видалення остаточної косої риски можна використовувати :n,mсинтаксис підрядкових рядків, наприклад:

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

Я не вірю, що , на жаль, існує спосіб поєднати %0синтаксис із :~n,mсинтаксисом.


7
Чудово ... Я використовував %~0\..- знав, що повинен бути кращий спосіб! Крім того, ви, ймовірно, захочете укласти %~dp0подвійні лапки ( "") у випадку, якщо у назві каталогу є пробіли тощо.
Cameron

1
Приємно! Але, %~dp0містить `` в кінці. У вас є ідея, як її зняти?
Міша Морошко

1
@Misha: Я припускаю, що ти маєш на увазі, як видалити '\' в кінці. Я оновив свою відповідь деталями.
Дін Хардінг

2
Приклад у відповіді чудово працює без лапок, навіть якщо на шляху є пробіл. (наприклад, SET msg=hello worldпрацює чудово). Однак, використовуючи% mypath% в іншому місці, ви хочете бути обережними, щоб використовувати його в лапках, хоча вони не потрібні cdні для одного.
Мартін Біль

2
Зараз посилання 404
StingyJack

12

Ви можете використовувати наступний скрипт, щоб отримати шлях без останнього "\"

for %%i in ("%~dp0.") do SET "mypath=%%~fi"

Це не видаляє ім'я файлу з контуру (наприклад, abc.txt у прикладі ОП).
dcp

4
@dcp Ер, це все ж.
Кайл Странд

@Kyle Strand - Так, я просто спробував ще раз, і зараз він працює добре. Я не впевнений, що сталося, коли я спробував це спочатку, можливо, я помилився десь у сценарії. Вибачте за плутанину і дякую, що вказали на це.
dcp

11

%~dp0може бути відносним шляхом. Щоб перетворити його на повний шлях, спробуйте щось подібне:

pushd %~dp0
set script_dir=%CD%
popd

6
Гаразд, так чому б не просто використовувати %~dp0безпосередньо?
jpaugh

5
Гірша версія прийнятої відповіді, опублікована через 5 років? Я не розумію.
Кайл Странд

Я думаю, це було розміщено для вирішення проблеми, згаданої у коментарях прийнятої відповіді - %~dp0може бути відносною, що може бути, а може бути і проблемою, залежно від випадку використання
Michael Mrozek

10
%~dp0не може містити відносний шлях, dпозначає диск та pшлях, яким чином диск може бути відносним?
jeb

5
У якому світі? Я щойно перевірив цю відповідь на Windows Server 2012 r2, і виявляється, %~dp0це буде абсолютний шлях навіть тоді, коли сценарій запускався як відносний шлях. Завдяки коментарю jeb, ця відповідь мене не обдурила. Чому люди просто складають речі та йдуть і починають поширювати свою дику фантазію на інших. У мене є цей колега, який це робить, але я звинувачував його (молодий) вік. Я хотів би, щоб мій голос був підрахований.
Битол

0

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

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


1
Я не можу бачити більше інформації, ніж в 9 років відповідь
Джеб

Додаткова інформація "d означає лише диск, ..." і т. Д. Дякую, @Hayz.
RJ Dunnill

-2

%cd% дасть вам шлях до каталогу, звідки працює сценарій.

Просто запустіть:

echo %cd%

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

-7

Це була б %CD%змінна.

@echo off
echo %CD%

%CD% повертає поточний каталог, у якому знаходиться пакетний сценарій.


35
% cd% повертає каталог, з якого був запущений скрипт, а не каталог, з якого знаходиться скрипт.
Міша Морошко

4
він працює, лише якщо ваш скрипт не змінює робочий каталог. Спробуйте CD C:\Temp <CR> ECHO %CD%( <CR>це новий рядок ...)
Дін Хардінг

6
Крім того, якщо ви клацніть правою кнопкою миші на скрипті та виберіть "Запустити як адміністратор", початковою поточною каталогом є C: \ Windows \ System32 незалежно від місця розташування сценарію.
Камерон

Хоча це не пряма відповідь на питання ОП, цей смак функціональності є саме тим, що я шукав, коли знайшов це питання. Дякую!
Золтан

Жодне з інших опублікованих рішень не працює для мене на 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

2
ОП запитує про сценарії оболонки BAT / CMD Windows, а не bash.
rivy
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.