Каков наилучший способ сделать подстроку в командном файле? - PullRequest
179 голосов
/ 12 марта 2009

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

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

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

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

Ответы [ 3 ]

376 голосов
/ 12 марта 2009

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

:: 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.

35 голосов
/ 03 февраля 2012

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

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

Итак:

SET TEXT=Hello World
SET SUBSTRING=!TEXT:~3,5!
ECHO !SUBSTRING!
13 голосов
/ 18 июня 2012

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

...