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

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

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

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

В этом сценарии можно с уверенностью предположить наличие 3-х буквенных расширений.

Ответ 1

Ну, для получения имени файла вашей партии самым простым способом было бы просто использовать %~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.

Ответ 2

Хорошо объяснено выше!

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

Итак:

SET TEXT=Hello World
SET SUBSTRING=!TEXT:~3,5!
ECHO !SUBSTRING!

Ответ 3

В качестве дополнительной информации для ответа Joey, которая не описывается с помощью 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 всегда всегда отображается имя функции, а не пакетного файла.
Но если вы используете хотя бы один модификатор, он снова отобразит имя файла!