Как лучше всего сделать подстроку в командном файле?

Я хочу получить имя запущенного в данный момент командного файла без расширения файла.

Благодаря этой ссылке у меня есть имя файла с расширением ... но как лучше всего сделать подстроку в пакетном файле?

Или есть другой способ получить имя файла без расширения?

В этом сценарии можно с уверенностью использовать трехбуквенные расширения.


person JosephStyons    schedule 11.03.2009    source источник


Ответы (3)


Что ж, чтобы просто получить имя файла вашего пакета, самым простым способом было бы просто использовать %~n0.

@echo %~n0

выведет имя (без расширения) текущего запущенного командного файла (если он не выполняется в подпрограмме, вызываемой call). Полный список таких «специальных» замен для имен путей можно найти с помощью help for в самом конце справки:

Кроме того, улучшена подстановка ссылок на переменные FOR. Теперь вы можете использовать следующий необязательный синтаксис:

%~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

Модификаторы можно комбинировать для получения сложных результатов:

%~dpI       - expands %I to a drive letter and path only
%~nxI       - expands %I to a file name and extension only
%~fsI       - expands %I to a full path name with short names only

Однако, чтобы точно ответить на ваш вопрос: Подстроки выполняются с использованием нотации :~start,length:

%var:~10,5%

извлечет 5 символов из позиции 10 в переменной окружения %var%.

ПРИМЕЧАНИЕ. Индекс строк отсчитывается от нуля, поэтому первый символ находится в позиции 0, второй - в позиции 1 и т. д.

Чтобы получить подстроки переменных аргументов, таких как %0, %1 и т. Д., Вы должны сначала назначить их обычной переменной среды, используя set:

:: Does not work:
@echo %1:~10,5

:: Assign argument to local variable first:
set var=%1
@echo %var:~10,5%

Синтаксис еще более мощный:

  • %var:~-7% извлекает последние 7 символов из %var%
  • %var:~0,-4% извлечет все символы, кроме последних четырех, что также избавит вас от расширения файла (при условии, что три символа после точки [.]).

См. help set для получения подробной информации об этом синтаксисе.

person Joey    schedule 11.03.2009
comment
Извлечение подстроки также не работает с переменными цикла FOR, поэтому вам придется сделать следующее (\ r \ n в коде означает разрывы строк, потому что SO, похоже, не допускает разрывов строк в комментариях): setlocal ENABLEDELAYEDEXPANSION \r\n for /f %%s in ('set') do ( \r\n set tmp=%%s \r\n echo !tmp:~-3! \r\n ) - person Fr0sT; 28.04.2014
comment
@ Fr0sT зачем это нужно делать для FOR петель? - person Bob; 18.01.2017
comment
@ Адриан, почему бы и нет? FOR - это краеугольная конструкция командных файлов, выполняющая довольно большое количество различных задач. Кстати, есть еще один способ справиться с задачей с помощью подпрограммы, т.е. for /f %%s in ('set') do call :DoSmth "%%s" \r\n ... \r\n :DoSmth \r\n set var=%1 \r\n echo %var:~1,3% - person Fr0sT; 19.01.2017
comment
@ Phate01, не используйте %date% для построения даты в определенном формате. Формат зависит от культуры пользователя и может измениться. Вместо этого используйте WMI, чтобы получить дату и время в удобном формате, который не зависит от настроек пользователя. Также я не уверен, что этот комментарий здесь делает, поскольку этот вопрос не касался даты или времени. - person Joey; 22.05.2018
comment
На самом деле ты прав, я думаю, я хотел прокомментировать другой вопрос :) - person Phate01; 22.05.2018
comment
%var is base 0 это только неявно :( получено из второго примера. - person user6698332; 23.05.2018
comment
@ Fr0sT Да, это работает, но вы должны использовать setlocal и включить отложенное расширение. - person user2262111; 23.09.2018
comment
@ user2262111, разве это не то, что я сказал в комментарии от 28 апреля 2014 года? - person Fr0sT; 24.09.2018

Красиво объяснено выше!

Для всех, кто может страдать, как я, чтобы заставить это работать в локализованной Windows (у меня XP на словацком), вы можете попробовать заменить % на !

So:

SET TEXT=Hello World
SET SUBSTRING=!TEXT:~3,5!
ECHO !SUBSTRING!
person BrandonSk    schedule 03.02.2012
comment
Обратите внимание, это будет работать только после команды setlocal ENABLEDELAYEDEXPANSION. - person Fr0sT; 28.04.2014
comment
попробуйте SET TEXT="<Hello World>", SET SUBSTRING=!TEXT:~1,-1! или SET SUBSTRING=%TEXT:~1,-1%, ECHO !SUBSTRING! или ECHO %SUBSTRING% - person Sasha Bond; 02.02.2021

В качестве дополнительной информации к ответу Джои, который не описан ни в set /?, ни в for /?.

%~0 заменяется на имя собственного пакета в точности так, как оно было набрано.
Итак, если вы запустите свой пакет, он будет расширен как

%~0   - mYbAtCh
%~n0  - mybatch
%~nx0 - mybatch.bat

Но есть одно исключение: расширение подпрограммы может привести к сбою.

echo main- %~0
call :myFunction
exit /b

:myFunction
echo func - %~0
echo func - %~n0
exit /b

Это приводит к

main - myBatch
Func - :myFunction
func - mybatch

В функции %~0 всегда заменяется именем функции, а не командного файла.
Но если вы используете хотя бы один модификатор, имя файла снова будет отображаться!

person jeb    schedule 18.06.2012