Що означає% ~ d0 у пакетному файлі Windows?


353

Я переглядаю пакетний файл, який визначає наступні змінні:

set _SCRIPT_DRIVE=%~d0
set _SCRIPT_PATH=%~p0
  • Що означають %~d0чи %~p0насправді означають?
  • Чи є набір відомих значень для таких речей, як поточна директорія, диск, параметри сценарію?
  • Чи є інші подібні ярлики, які я міг би використати?

Відповіді:


539

Магічні змінні %n містять аргументи, які використовуються для виклику файлу: %0це шлях до самого bat-файлу, %1це перший аргумент після, %2другий тощо.

Оскільки аргументи часто є файловими шляхами, для вилучення частин шляху є деякий додатковий синтаксис. ~dє диск, ~pце шлях (без диска), ~nце ім'я файлу. Їх можна комбінувати, так що ~dpце диск + шлях.

%~dp0 Тому досить корисно для кажана: це папка, в якій знаходиться виконавчий файл bat.

Ви також можете отримати інші види метаінформації про файл: ~tце часова мітка, ~zрозмір.

Подивіться тут для посилання для всіх команд в командному рядку. Коди магічних тильдів описані в розділі для .


15
Зауважте до себе: echo %~dp0не працюватиме в командному рядку, лише у пакетному файлі. Да!
northben

2
чи є різниця між %~d0і %~d0%?
Джеффрі

2
@Pacerier:% 0 - це повний шлях, включаючи ім'я файлу сценарію. % ~ dp0 - шлях до папки, що містить сценарій, але виключає ім'я файлу сценарію.
ЖакБ

4
Зауваження до себе: echo %~pd0дає такий самий вихід, як і відлуння %~dp0(замість зворотного, як очікувалося). Крім того , значення %0є різним у залежності від того , двічі клацніть пакетний файл або запустити його з ЦМД.
Pacerier

152

Вони є посиленими змінними замінами. Вони змінюють змінні% N, використовувані в пакетних файлах. Дуже корисно, якщо ви займаєтеся пакетним програмуванням в Windows.

%~I         - expands %I removing any surrounding quotes ("")
%~fI        - expands %I to a fully qualified path name
%~dI        - expands %I to a drive letter only
%~pI        - expands %I to a path only
%~nI        - expands %I to a file name only
%~xI        - expands %I to a file extension only
%~sI        - expanded path contains short names only
%~aI        - expands %I to file attributes of file
%~tI        - expands %I to date/time of file
%~zI        - expands %I to size of file
%~$PATH:I   - searches the directories listed in the PATH
               environment variable and expands %I to the
               fully qualified name of the first one found.
               If the environment variable name is not
               defined or the file is not found by the
               search, then this modifier expands to the
               empty string

Ви можете дізнатися вище, запустивши FOR /?.


48

Так, є й інші ярлики, якими ви можете скористатися, які наведені нижче. У вашій команді ~ d0 означатиме букву диска 0-го аргументу.

~ expands the given variable
d gets the drive letter only
0 is the argument you are referencing

Оскільки 0-й аргумент - це шлях сценарію, він отримує для вас літеру диска. Ви також можете використовувати такі ярлики.

%~1         - expands %1 removing any surrounding quotes (")
%~f1        - expands %1 to a fully qualified path name
%~d1        - expands %1 to a drive letter only
%~p1        - expands %1 to a path only
%~n1        - expands %1 to a file name only
%~x1        - expands %1 to a file extension only
%~s1        - expanded path contains short names only
%~a1        - expands %1 to file attributes
%~t1        - expands %1 to date/time of file
%~z1        - expands %1 to size of file
%~$PATH:1   - searches the directories listed in the PATH
               environment variable and expands %1 to the fully
               qualified name of the first one found.  If the
               environment variable name is not defined or the
               file is not found by the search, then this
               modifier expands to the empty string    

%~dp1       - expands %1 to a drive letter and path only
%~nx1       - expands %1 to a file name and extension only
%~dp$PATH:1 - searches the directories listed in the PATH
               environment variable for %1 and expands to the
               drive letter and path of the first one found.
%~ftza1     - expands %1 to a DIR like output line

Це також можна знайти безпосередньо в командному рядку під час запуску CALL /? або ЗА /?



9

Ще одна порада, яка б дуже допомогла, полягає в тому, що для встановлення поточного каталогу на інший привід слід скористатися %~d0спочатку, потімcd %~dp0 . Це змінить каталог на привід пакетного файлу, а потім змінить його папку.

Для #oneLinerLovers, cd /d %~dp0 буде змінено і диск, і каталог :)

Сподіваюся, що це комусь допоможе.


7
Інший варіант полягає в тому pushd %~dp0, що немає проблем із зміною поточного накопичувача і дає додатковий бонус за можливість popdпізніше повернутися до початкового диска / шляху.
bcrist


6

Деякі спостереження:

Якщо двічі клацнути, пакетний файл %0буде оточений лапками. Наприклад, якщо ви збережете цей файл у вигляді c:\test.bat:

@echo %0
@pause

Двічі клацнувши по ньому, відкриється новий командний рядок з виходом:

"C:\test.bat"

Але якщо ви спочатку відкриєте командний рядок і зателефонуєте йому безпосередньо з цього командного рядка, %0буде посилатися на все, що ви ввели . Якщо ви будете вводити test.batEnter, у висновку не %0буде жодних лапок, оскільки ви не ввели лапки:

c:\>test.bat
test.bat

Якщо ви введете текст testEnter, вихідний файл %0також не матиме розширення, оскільки ви не ввели розширення:

c:\>test
test

Те саме tEsTEnter:

c:\>tEsT
tEsT

Якщо ви введете "test"Enter, вихід %0буде мати лапки (оскільки ви їх набрали), але без розширення:

c:\>"test"
"test"

Нарешті, якщо ви введете "C:\test.bat", вихід буде точно таким, як якщо б ви двічі клацнули по ньому:

c:\>"C:\test.bat"
"C:\test.bat"

Зауважте, що це не всі можливі значення, %0оскільки ви можете викликати сценарій з інших папок:

c:\some_folder>/../teST.bAt
/../teST.bAt

Усі приклади, показані вище, також впливатимуть %~0, оскільки вихід %~0просто - вихід %0 мінусових лапок (якщо такі є).


3

Цей код пояснює використання символу ~ tilda, який був для мене найбільш заплутаним. Як тільки я зрозумів це, це значно полегшує розуміння:

@ECHO off
SET "PATH=%~dp0;%PATH%"
ECHO %PATH%
ECHO.
CALL :testargs "these are days" "when the brave endure"
GOTO :pauseit
:testargs
SET ARGS=%~1;%~2;%1;%2
ECHO %ARGS%
ECHO.
exit /B 0
:pauseit
pause

1

Він відображає, наприклад, поточне розташування файлу чи каталогу, у якому ви зараз перебуваєте. Наприклад; якщо ваш пакетний файл знаходився в каталозі робочого столу, то "% ~ dp0" відображатиме каталог робочого столу. якщо ви хочете, щоб у ньому відображався поточний каталог із поточним іменем файлу, ви можете ввести "% ~ dp0% ~ n0% ~ x0".


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