Ну, для получения имени файла вашей партии самый простой способ - просто использовать %~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
подробности об этом синтаксисе.
setlocal ENABLEDELAYEDEXPANSION \r\n for /f %%s in ('set') do ( \r\n set tmp=%%s \r\n echo !tmp:~-3! \r\n )
FOR
циклов?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%
%date:~0,2%%date:~3,2%%date:~6,4%%time:~0,2%%time:~3,2%%time:~6,2%
%date%
для построения даты в определенном формате. Формат зависит от культуры пользователя и может измениться. Вместо этого используйте WMI, чтобы получить дату и время в удобном формате, который не зависит от настроек пользователя. Также я не уверен, что этот комментарий делает здесь, так как этот вопрос не был о дате или времени.Красиво объяснил выше!
Для всех тех , кто может пострадать , как мне получить эту работу в локализованной Windows (шахта XP в словацком), вы можете попытаться заменить
%
с!
Так:
источник
setlocal ENABLEDELAYEDEXPANSION
командыВ качестве дополнительной информации к ответу Джои, которая не описана в справке
set /?
ниfor /?
.%~0
расширяется до имени собственной партии, в точности так, как она была напечатана.Так что, если вы начнете свою партию, она будет расширена как
Но есть одно исключение, расширение подпрограммы может потерпеть неудачу
Это приводит к
В функции
%~0
всегда раскрывается имя функции, а не командный файл.Но если вы используете хотя бы один модификатор, он снова покажет имя файла!
источник