Командний рядок .cmd / .bat script, як отримати каталог запущеного сценарію


Відповіді:


58

Раймонд Чен має кілька ідей:

https://devblogs.microsoft.com/oldnewthing/20050128-00/?p=36573

Цитую тут повністю, оскільки архіви MSDN, як правило, є дещо ненадійними:

Найпростіший спосіб - використовувати %CD%псевдозмінну. Він розширюється до поточного робочого каталогу.

set OLDDIR=%CD%
.. do stuff ..
chdir /d %OLDDIR% &rem restore current directory

(Звичайно, збереження / відновлення каталогу можна було б зробити легше за допомогою pushd/ popd, але тут справа не в цьому.)

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

set _=%CD%\curfile.txt
cd ... some other directory ...
somecommand args %_% args

(Я люблю використовувати %_%як змінну середовища для подряпин.)

Введіть, SET /?щоб побачити інші псевдо-змінні, надані процесором команд.

Також коментарі в статті варто відсканувати, наприклад, цей (через WayBack Machine, оскільки коментарі зникли зі старих статей):

http://blogs.msdn.com/oldnewthing/archive/2005/01/28/362565.aspx#362741

Це стосується використання% ~ dp0:

Якщо ви хочете знати, де живе пакетний файл: %~dp0

%0- це ім'я командного файлу. ~dpнадає вам диск та шлях вказаного аргументу.


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

3
@ketorin: Це НЕ відповідає на питання. % CD% зміниться , якщо сам сценарій зміни каталогу на протязі його використання (Pushd / кд / ..) , але % ~ dp0 буде НЕ зміниться , і завжди вказати, де скрипт знаходиться.
Джей,

-1 Не можу сказати, відповідає це запитання чи ні. Можете показати приклад?
Iain Samuel McLean Elder

1
@IainElder - ти, мабуть, маєш рацію, я відвідав цю відповідь кілька днів тому і не був надто задоволений нею. Коментарі до блогу Реймонда Чена, на які я посилаюся, здається, були заплямовані ДС - тому в цьому криється небезпека відповідей, які повністю покладаються на пов'язані зовнішні джерела. Я намагався знайти якийсь інший матеріал, щоб підтвердити свою відповідь, але це так давно в тумані часу. Позначення для видалення. Дякуємо за те, що я дав мені чайові з цим :) Ви не випадково працюєте на SkyScanner, правда?
Kev

1
@Kev Це нормально, якщо ви скопіюєте корисну частину до Stack Overflow, зверніться до зовнішніх джерел. Думаю, зараз вже пізно! І так, я, як відомо, ховаюся в центрі обробки даних Skyscanner ;-)
Іен Семюел Маклін Старійшина

147

Це еквівалентно шляху сценарію:

%~dp0

Тут використовується синтаксис розширення пакетного параметра. Параметр 0 - це завжди сам сценарій.

Якщо ваш скрипт зберігається в C:\example\script.bat, тоді %~dp0оцінює до C:\example\.

ss64.com містить більше інформації про синтаксис розширення параметра. Ось відповідний уривок:

Ви можете отримати значення будь-якого параметра, використовуючи%, а потім його числове положення в командному рядку.

[...]

Коли параметр використовується для подання імені файлу, тоді можна застосувати такий розширений синтаксис:

[...]

% ~ d1 Розгорніть% 1 лише на букву Диска - C:

[...]

% ~ p1 Розгорніть% 1 до Шляху, наприклад, \ utils \ сюди входить кінцевий термін \, який деякими командами може бути інтерпретований як символ втечі.

[...]

Модифікатори вище можна комбінувати:

% ~ dp1 Розгорніть% 1 лише на букву диска та шлях

[...]

Ви можете отримати назву шляху до самого пакетного сценарію за допомогою% 0, до нього можна застосувати розширення параметрів, тому% ~ dp0 поверне Drive і Path до пакетного сценарію, наприклад W: \ scripts \


Саме те, що мені було потрібно. І я прив’язав цей заклик до свого блогу, як нагадування :)
Олів’є Х

Не впевнений, що це помилка / помилка в цитованому тексті, але в моєму сценарії мені потрібно "% ~ d0", щоб отримати букву диска! % ~ d1 порожній у моєму випадку.
fklappan

На мої очі / ситуація це перевершує прийняту відповідь. Якщо ви запустите скрипт командного рядка "як адміністратор" (клацніть на ньому правою кнопкою миші), ваш скрипт буде виконаний з Windows \ system32. Прийнята відповідь НЕ дасть вам розташування сценарію, вона знову дасть вам Windows \ system32. Тобто ЦЯ відповідь допоможе вам це виправити, ви починаєте свій сценарій з cd% ~ dp0
Ярослав Заруба

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