Может ли командный файл Windows определять собственное имя файла?

Может ли командный файл 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 ====================  =============== пауза  

Оцените статью
techsly.ru
Добавить комментарий