Відповіді:
Так.
Використовуйте спеціальну %0
змінну, щоб отримати шлях до поточного файлу.
Напишіть, %~n0
щоб отримати лише ім'я файлу без розширення.
Напишіть, %~n0%~x0
щоб отримати ім'я файлу та розширення.
Також можна написати, %~nx0
щоб отримати ім'я файлу та розширення.
cd
вперше
%cd%
поверне Поточний каталог процесу, який викликав пакетний файл. Так що, якщо ви підкажете D:\dir1
і введіть Y:\foo\bar.bat
, якщо bar.bat
є, @echo %cd%
то він виведе D:\dir1
.
Ви можете отримати ім'я файлу, але ви також можете отримати повний шлях, залежно від місця, розміщеного між '% ~' та '0'. Візьміть свій вибір
d -- drive
p -- path
n -- file name
x -- extension
f -- full path
Наприклад, зсередини c: \ tmp \ foo.bat %~nx0
дає "foo.bat", тоді як %~dpnx0
дає "c: \ tmp \ foo.bat". Зверніть увагу, шматки завжди зібрані в канонічному порядку, тож якщо вам приємно і спробувати %~xnpd0
, ви все одно отримаєте "c: \ tmp \ foo.bat"
f
це ім'я файлу, але у своїх прикладах ви використовуєте n
його ім'я. Після деякого тестування, здається, що f
це повний шлях, і n
це ім'я файлу.
%~xnpd0
" ... я тебе люблю.
Використовуючи наступний сценарій, на основі відповіді SLaks, я визначив, що правильна відповідь:
echo The name of this file is: %~n0%~x0
echo The name of this file is: %~nx0
І ось мій тестовий сценарій:
@echo off
echo %0
echo %~0
echo %n0
echo %x0
echo %~n0
echo %dp0
echo %~dp0
pause
Що мені здається цікавим, це те, що % nx0 не буде працювати, враховуючи, що ми знаємо, що '~' char зазвичай використовується для викреслення / обрізки лапок змінної.
Майте на увазі, що 0
це окремий випадок номерів параметрів всередині пакетного файлу, де 0
означає цей файл, як вказано в командному рядку .
Отже, якщо файл є myfile.bat, ви можете викликати його декількома способами, наступним чином, кожен з яких дасть вам інший результат від використання %0
або %~0
використання:
myfile
myfile.bat
mydir\myfile.bat
c:\mydir\myfile.bat
"c:\mydir\myfile.bat"
Все вищезазначене є законними дзвінками, якщо ви телефонуєте з правильного відносного місця до каталогу, в якому він існує. %~0
викреслює цитати з останнього прикладу, тоді як%0
ні.
Тому що всі вони дають різні результати, %0
і %~0
навряд чи вони будуть такими, якими ви насправді хочете скористатися.
Ось пакетний файл для ілюстрації:
@echo Full path and filename: %~f0
@echo Drive: %~d0
@echo Path: %~p0
@echo Drive and path: %~dp0
@echo Filename without extension: %~n0
@echo Filename with extension: %~nx0
@echo Extension: %~x0
@echo Filename as given on command line: %0
@echo Filename as given on command line minus quotes: %~0
@REM Build from parts
@SETLOCAL
@SET drv=%~d0
@SET pth=%~p0
@SET fpath=%~dp0
@SET fname=%~n0
@SET ext=%~x0
@echo Simply Constructed name: %fpath%%fname%%ext%
@echo Fully Constructed name: %drv%%pth%%fname%%ext%
@ENDLOCAL
pause
Спробуйте запустити нижче приклад, щоб відчути, як працюють магічні змінні.
@echo off
SETLOCAL EnableDelayedExpansion
echo Full path and filename: %~f0
echo Drive: %~d0
echo Path: %~p0
echo Drive and path: %~dp0
echo Filename without extension: %~n0
echo Filename with extension: %~nx0
echo Extension: %~x0
echo date time : %~t0
echo file size: %~z0
ENDLOCAL
Пов'язані правила наступні.
%~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
@echo off
Set z=%%
echo.
echo %z%0.......%0
echo %z%~0......%~0
echo %z%n0......%n0
echo %z%x0......%x0
echo %z%~n0.....%~n0
echo %z%dp0.....%dp0
echo %z%~dp0....%~dp0
echo.
Я помітив, що ім'я файлу, задане% ~ 0 та% 0, - це те, як воно було введене в командній оболонці, а не те, як насправді називається цей файл. Отже, якщо ви хочете, щоб буквальний регістр використовувався для імені файлу, ви повинні використовувати% ~ n0. Однак це не залишить розширення файлу. Але якщо ви знаєте ім'я файлу, ви можете додати наступний код.
set b=%~0
echo %~n0%b:~8,4%
Я дізнався, що ": ~ 8,4%" означає почати з 9 символу змінної, а потім показати показати наступні 4 символи. Діапазон - від 0 до кінця рядка змінної. Тож% Шлях% був би дуже довгим!
fIlEnAmE.bat
012345678901
Однак це не такий звук, як рішення Джола (% ~ x0) вище.
C:\bin>filename.bat
%0.......filename.bat
%~0......filename.bat
. . .
C:\bin>fIlEnAmE.bat
%0.......fIlEnAmE.bat
%~0......fIlEnAmE.bat
%n0......n0
%x0......x0
%~n0.....FileName
%dp0.....dp0
%~dp0....C:\bin\
%~n0%b:~8,4%...FileName.bat
Press any key to continue . . .
C:\bin>dir
Volume in drive C has no label.
Volume Serial Number is CE18-5BD0
Directory of C:\bin
. . .
05/02/2018 11:22 PM 208 FileName.bat
@echo off
Set z=%%
set b=%~0
echo.
echo %z%0.......%0
echo %z%~0......%~0
echo %z%n0......%n0
echo %z%x0......%x0
echo %z%~n0.....%~n0
echo %z%dp0.....%dp0
echo %z%~dp0....%~dp0
echo.
echo A complex solution:
echo ===================================
echo %z%~n0%z%b:~8,4%z%...%~n0%b:~8,4%
echo ===================================
echo.
echo The preferred solution:
echo ===================================
echo %z%~n0%z%~x0.......%~n0%~x0
echo ===================================
pause
%0
це те, що ви шукаєте. Див. [Це запитання] [1] для отримання додаткової інформації. [1]: stackoverflow.com/questions/357315/…