Прежде всего, не используйте 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% равно нулю.