Прежде всего, не используйте path
в качестве имени переменной.
Командная строка Windows (в отличие от большинства компонентов Unix, включая оболочки) обрабатывает имена переменных без учета регистра, поэтому path
такой же, как PATH
, который является вашим путем поиска выполнения, и если вы назначаете что-то случайное для этого, вы ' Я буду в мире боли.
Используйте %variable:str1=str2%
form.
(Я предполагаю, что вы знаете, что set /?
документы эти формы.)
Это замена:
C:\> set play=food
C:\> echo %play:foo=bar%
bard
C:\> set animal=cat
C:\> echo %animal:at=ow%
cow
Это поддерживает очень ограниченную возможность сопоставления с образцом; %variable:*str1=str2%
найдет и удалит все, вплоть до первого вхождения str1
и заменит его на str2
.
В %variable:*\=%
заменят все до и включая первый \
с нулем.
Например, если %pathname%
равен C:\Windows\Example\001 Example\005 Example
, тогда %pathname:*\=%
будет соответствовать Windows\Example\001 Example\005 Example
(без C:\
).
Если у вашего пути всегда будет четыре уровня, вы можете сделать
for %%I in (%pathname%) do set tempname=%%~I
set tempname=%tempname:*\=%
set tempname=%tempname:*\=%
set tempname=%tempname:*\=%
set tempname=%tempname:*\=%
set basename=%tempname%
echo %basename%
Утверждение for
- это нечто вроде клуджа.
Это цикл, который гарантированно будет выполнен ровно один раз с индексной переменной %%I
для которой установлено значение %pathname%
1.
Затем он присваивает %%~I
tempname
.
%%~I
- это значение %%I
(т. Е. Значение %pathname%
) за исключением того, что если эта строка начинается и заканчивается символами кавычки ("
), они удаляются.
Если вы уверены, что %pathname%
не начинается и не заканчивается кавычками (например, потому что вы уже сделали это или что-то эквивалентное), вы можете пропустить этот шаг и просто начать, сказав set tempname=%pathname%
.
Если путь имеет неопределенное количество уровней, выполните
for %%I in (%pathname%) do set tempname1=%%~I
:loop
set tempname2=%tempname1:*\=%
if not %tempname1% == %tempname2% ( set tempname1=%tempname2% & goto loop )
set basename=%tempname1%
echo %basename%
который зацикливается, пока не осталось \
s.
______________
1 На самом деле его поведение может быть более сложным, если %pathname%
имеет значение null (пусто), или если он содержит символы подстановки (сопоставления с образцом), например ?
и *
.
Могут быть и другие специфические случаи, которые я не нашел.
(Пожалуйста, дайте мне знать, если есть более чистый способ работы с цитатами.)
Предупреждение: я наблюдал %variable:str1=str2%
чтобы вести себя странно, если %variable%
равно нулю.