Может ли командный файл Windows определять собственное имя файла?
Например, если я запускаю командный файл C: Temp myScript.bat, есть ли в myScript команда. bat, который может определить строку «myScript.bat»?
Да.
Используйте специальную переменную % 0
, чтобы получить путь к текущему файлу.
Напишите % ~ n0
, чтобы получить только имя файла без расширения.
Напишите % ~ n0% ~ x0
, чтобы получить имя файла и расширение.
Также можно написать % ~ nx0
, чтобы получить имя файла и расширение.
Вы можете получить имя файла, но вы также можете получить полный путь, в зависимости от того, что вы поместите между ‘% ~’ и «0». Выберите из
d - drivep - pathn - имя файла x - extensionf - полный путь
Например , изнутри c: tmp foo.bat, % ~ nx0
дает вам «foo.bat», а % ~ dpnx0
дает «c: tmp foo.bat «. Обратите внимание, что части всегда собираются в каноническом порядке, поэтому, если вы проявите симпатию и попробуете % ~ xnpd0
, вы все равно получите «c: tmp foo. летучая мышь
Вы можете получить имя файла, но вы также можете получить полный путь, в зависимости от того, что вы размещаете между «% ~» и «0». Выберите из
d - drivep - pathn - имя файла x - extensionf - полный путь
Например , изнутри c: tmp foo.bat, % ~ nx0
дает вам «foo.bat», а % ~ dpnx0
дает «c: tmp foo.bat «. Обратите внимание, что части всегда собираются в каноническом порядке, поэтому, если вы проявите симпатию и попробуете % ~ xnpd0
, вы все равно получите «c: tmp foo. bat «
Используя следующий скрипт, основанный на ответе SLaks, я определил, что правильный ответ:
echo Имя этого файла:% ~ n0% ~ x0echo Имя этого файла:% ~ nx0
А вот мой тестовый сценарий:
@echo offecho% 0echo% ~ 0echo% n0echo% x0echo% ~ n0echo% dp0echo% ~ dp0pause
Что мне интересно, так это то, что % nx0 не будет работать, учитывая, что мы знаем, что символ ‘~’ обычно используется для удаления/обрезки кавычек из переменной.
Используя следующий скрипт, основанный на ответе SLaks, я определил, что правильный ответ:
echo Имя этого файла:% ~ n0% ~ x0echo Имя этого файла:% ~ nx0
И вот мой тестовый сценарий:
@echo offecho% 0echo% ~ 0echo% n0echo% x0echo% ~ n0echo% dp0echo% ~ dp0pause
Что мне интересно, так это то, что % nx0 не будет работать, поскольку мы знаем, что символ ‘~’ обычно используется для удаления/обрезки кавычек из переменной.
Имейте в виду, что 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 Полный путь и имя файла:% ~ f0 @ echo Диск:% ~ d0 @ echo Путь:% ~ p0 @ echo Диск и путь:% ~ dp0 @echo Имя файла без расширения:% ~ n0 @ echo Имя файла с расширением:% ~ nx0 @ echo Расширение:% ~ x0 @ echo Имя файла, указанное в командной строке:% 0 @ echo Имя файла, указанное в командной строке, минус кавычки:% ~ 0 @REM Сборка из частей @ SETLOCAL @ SET drv =% ~ d0 @ SET pth =% ~ p0 @ SET fpath =% ~ dp0 @ SET fname =% ~ n0 @ SET ext =% ~ x0 @ echo Просто построенное имя:% fpath %% fname %% ext% @ echo Полностью построенное имя:% drv %% pth %% fname %% ext% @ ENDLOCALpause
Имейте в виду, что 0
— это частный случай p номера параметров внутри пакетного файла, где 0
означает этот файл, указанный в командной строке .
Итак, если файл это myfile.bat, вы можете вызвать его несколькими способами следующим образом, каждый из которых даст вам разные выходные данные из % 0
или % ~ 0
использование:
myfile
myfile.bat
mydir myfile.bat
c: mydir myfile.bat
"c: mydir myfile. bat "
Все вышеперечисленные вызовы являются допустимыми, если вы вызываете их из правильного относительного места в каталог, в котором он существует. % ~ 0
удаляет кавычки из последнего примера, а % 0
— нет.
Поскольку все они дают разные результаты, % 0
и % ~ 0
вряд ли будут тем, что вы действительно хотите использовать.
Вот пакетный файл для иллюстрации:
@echo Полный путь и имя файла:% ~ f0 @ echo Диск:% ~ d0 @ echo Путь:% ~ p0 @ echo Диск и путь:% ~ dp0 @ echo Имя файла без расширения:% ~ n0 @ echo Имя файла с расширением:% ~ nx0 @ echo Расширение:% ~ x0 @ echo Имя файла, указанное в командной строке:% 0 @ echo Имя файла, указанное в командной строке, минус кавычки:% ~ 0 @ REM Сборка из частей @ SETLOCAL @ SET drv = % ~ d0 @ SET pth =% ~ p0 @ SET fpath =% ~ dp0 @ SET fname =% ~ n0 @ SET ext =% ~ x0 @ echo Простое построенное имя:% fpath %% fname %% ext% @ echo Полностью построено name:% drv %% pth %% fname %% ext% @ ENDLOCALpause
Попробуйте к запустите приведенный ниже пример, чтобы почувствовать, как работают магические переменные.
@echo offSETLOCAL EnableDelayedExpansionecho Полный путь и имя файла:% ~ f0echo Диск:% ~ d0echo Путь:% ~ p0echo Drive и путь:% ~ dp0echo Имя файла без расширения:% ~ n0echo Имя файла с расширением:% ~ nx0echo Расширение:% ~ x0echo дата время:% ~ t0echo размер файла:% ~ z0ENDLOCAL
Соответствующие правила следующие.
% ~ I - расширяет% I, удаляя все окружающие кавычки ("")% ~ fI - расширяет% I до полного имени пути% ~ dI - расширяет% I только до буквы диска% ~ pI - расширяет% I только до пути% ~ nI - расширяет% I только до имени файла% ~ xI - расширяет% I только до расширения файла% ~ sI - расширяется path содержит только короткие имена% ~ aI - расширяет% I до атрибутов файла% ~ tI - расширяет% I до даты/времени файла% ~ zI - расширяет% I до размера файла% ~ $ PATH: I - выполняет поиск каталоги, перечисленные в переменной среды PATH, и раскрывает% I до полного имени первого найденного. Если имя переменной среды не определено или файл не найден поиском, этот модификатор заменяется пустой строкой
Попробуйте запустить пример ниже, чтобы почувствовать, как работают магические переменные.
@echo offSETLOCAL EnableDelayedExpansionecho Полный путь и имя файла:% ~ f0echo Диск:% ~ d0echo Путь:% ~ p0echo Диск и путь:% ~ dp0echo Имя файла без расширения:% ~ n0echo Имя файла с расширением:% ~ nx0echo Расширение:% ~ x0echo дата время:% ~ t0 Размер файла эха:% ~ z0ENDLOCAL
Соответствующие правила следующие.
% ~ I - расширяет% I, удаляя все окружающие кавычки ("")% ~ fI - расширяет% I до полного имени пути% ~ dI - расширяет% I до только буква диска% ~ pI - расширяет% I только до пути% ~ nI - расширяет% I только до имени файла% ~ xI - расширяет% I только до расширения файла% ~ sI - расширенный путь содержит только короткие имена% ~ aI - расширяет% I до атрибутов файла% ~ tI - расширяет% I до даты/времени файла% ~ zI - расширяет% I до размера файла% ~ $ PATH: I - выполняет поиск в каталогах, перечисленных в среде PATH переменной и заменяет% I на полное имя первого найденного. Если имя переменной среды не определено или файл не найден поиском, этот модификатор заменяется пустой строкой
Ниже мой исходный код:
@echo offSet z = %% echo.echo% z% 0 ....... % 0echo% z% ~ 0 ......% ~ 0echo% z% n0 ......% n0echo% z% x0 ......% x0echo% z% ~ n0 ..... % ~ n0echo% z% dp0 .....% dp0echo% z% ~ dp0 ....% ~ dp0echo.
Я заметил, что имя файла дано% ~ 0 а% 0 — это способ, которым он был введен в командной оболочке, а не то, как этот файл фактически назван. Поэтому, если вы хотите использовать буквальный регистр для имени файла, вы должны использовать% ~ n0. Однако при этом не будет учитываться расширение файла. Но если вы знаете имя файла, вы можете добавить следующий код.
set b =% ~ 0echo% ~ n0% b: ~ 8,4%
Я узнал, что «: ~ 8,4% «означает начало с 9-го символа переменной, а затем отображение следующих 4 символов. Диапазон составляет от 0 до конца переменной строки. Так что% Path% будет очень длинным!
fIlEnAmE.bat012345678901
Однако это не так хорошо, как решение Джула ( % ~ 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 ..... Имя файла% dp0 ..... dp0% ~ dp0 .... C: bin % ~ n0% b: ~ 8,4% ... Имя файла.bat Нажмите любую клавишу для Продолжать . . .C: bin> dir Том на диске C не имеет метки. Серийный номер тома: CE18-5BD0, каталог C: bin. . .05/02/2018 23:22 208 FileName.bat
Вот окончательный код
@echo offSet z = %% set b =% ~ 0echo.echo% z% 0 .......% 0echo% z% ~ 0 ......% ~ 0echo% z% n0 ... ...% n0echo% z% x0 ......% x0echo% z% ~ n0 .....% ~ n0echo% z% dp0 .....% dp0echo% z% ~ dp0 .... % ~ dp0echo.echo Комплексное решение: echo ===================================== echo% z% ~ n0% z% b: ~ 8,4% z% ...% ~ n0% b: ~ 8,4% echo ====================== ============= echo.echo Предпочтительное решение: echo ============================= ====== эхо% z% ~ n0% z% ~ x0 .......% ~ n0% ~ x0echo ==================== =============== пауза
Ниже мой исходный код:
@echo offSet z = %% echo.echo% z% 0 .......% 0echo% z% ~ 0 .. ....% ~ 0echo% z% n0 ......% n0echo% z% x0 ......% x0echo% z% ~ n0 .....% ~ n0echo% z% dp0 .. ... % dp0echo% z% ~ dp0 ....% ~ dp0echo.
Я заметил, что имя файла, указанное% ~ 0, а% 0 — это то, как оно было введено в команду -shell, а не то, как этот файл на самом деле назван. Поэтому, если вы хотите использовать буквальный регистр для имени файла, вы должны использовать% ~ n0. Однако при этом не будет учитываться расширение файла. Но если вы знаете имя файла, вы можете добавить следующий код.
set b =% ~ 0echo% ~ n0% b: ~ 8,4%
Я узнал, что «: ~ 8,4% «означает начало с 9-го символа переменной, а затем отображение следующих 4 символов. Диапазон составляет от 0 до конца переменной строки. Так что% Path% будет очень длинным!
fIlEnAmE.bat012345678901
Однако это не так хорошо, как решение Джула ( % ~ 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 ..... Имя файла% dp0 ..... dp0% ~ dp0 .... C: bin % ~ n0% b: ~ 8,4% ... Имя файла.bat Нажмите любую клавишу для Продолжать . . .C: bin> dir Том на диске C не имеет метки. Серийный номер тома: CE18-5BD0, каталог C: bin. . .05/02/2018 23:22 208 FileName.bat
Вот окончательный код
@echo offSet z = %% set b =% ~ 0echo.echo% z% 0 .......% 0echo% z% ~ 0 ......% ~ 0echo% z% n0 ... ...% n0echo% z% x0 ......% x0echo% z% ~ n0 .....% ~ n0echo% z% dp0 .....% dp0echo% z% ~ dp0 .... % ~ dp0echo.echo Комплексное решение: echo ===================================== echo% z% ~ n0% z% b: ~ 8,4% z% ...% ~ n0% b: ~ 8,4% echo ====================== ============= echo.echo Предпочтительное решение: echo ============================= ====== эхо% z% ~ n0% z% ~ x0 .......% ~ n0% ~ x0echo ==================== =============== пауза