2009-03-11 3 views
168

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

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

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

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

ответ

346

Ну, для получения имени файла вашей партии самым простым способом было бы просто использовать %~n0.

@echo %~n0 

будет выводить имя (без расширения), в настоящее время работает командный файл (если не выполнены в виде подпрограммы, созванной call). Полный перечень таких «специальных» замены для имен путей могут быть найдены с help 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.

+0

Это отличный, тщательный ответ. Большое спасибо. – JosephStyons

+0

Ну, теперь три ответа скатываются в один или около того, благодаря Патрику :) – Joey

+18

Вывод субстроек не работает с переменными цикла FOR, так что вам придется делать следующее (\ r \ n в средней строке кода ломается, потому что SO, похоже, не допускает разрывов строк в комментариях): 'setlocal ENABLEDELAYEDEXPANSION \ r \ n for/f %% s in ('set') do (\ r \ n \t set tmp = %% s \ r \ n \t echo! Tmp: ~ -3! \ R \ n ) ' – Fr0sT

26

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

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

Итак:

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

Обратите внимание, что это будет работать только после команды' setlocal ENABLEDELAYEDEXPANSION' – Fr0sT

+0

Или, если вы вызываете командную строку с/V, т.е. 'cmd/v' – Omertron

11

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

Смежные вопросы