1

Например, у меня есть следующий путь:"C:\Windows\Example\001 Example\005 Example" Я должен извлечь "005 Example" из этой строки. Я пробовал это с "set path=%path:~0,11%" , но путь также может быть "C:\Windows\Example\001 Example\005 Example_2"

Что мне нужно, это обрезать строку после последнего "\"

Как я могу это сделать?

1 ответ1

1

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .