Манипуляции со строками с переменной в FOR /F

Вопрос или проблема

У меня есть несколько каталогов, некоторые из которых интересные:

>DIR /B
другой_интересный_каталог
один_скучный_каталог
один_интересный_каталог
ещё_один_интересный_каталог

Из интересных каталогов я хочу извлечь часть до _интересный_каталог. Я пытался

FOR /F %d IN ('DIR /B ^| FINDSTR интересный') DO ECHO %d:~0,-17%

с этим результатом:

другой_интересный_каталог:~0,-17%
один_интересный_каталог:~0,-17%
ещё_один_интересный_каталог:~0,-17%

Так что я попробовал

FOR /F %d IN ('DIR /B ^| FINDSTR интересный') DO SET a=%d & ECHO %a:~0,-17%

с этим результатом:

ещё_один
ещё_один
ещё_один

Как я могу извлечь другой, один и ещё_один? Я предпочёл бы сделать это в одной команде, но пакетный файл тоже подойдёт.

В консоли:

FOR /F %d IN ('DIR /B ^| FINDSTR интересный') DO @SET "a=%d" & call ECHO.^%a:~0,-16^%

В скрипте:

@echo off
setlocal
FOR /F %d IN ('DIR /B ^| FINDSTR интересный') DO SET "a=%d" & call ECHO.%%a:~0,-16%%

Подробности о правилах экранирования в пакетных файлах:

.

Ответ или решение

Для выполнения манипуляции со строками в Windows с помощью командного интерпретатора (CMD) и получения нужной части имени директории до "_interesting_dir", необходимо провести ряд манипуляций. Ранее вы пытались использовать команду FOR /F, однако сталкивались с проблемами, связанными с областью видимости переменных и экранированием. В этом ответе мы подробно рассмотрим правильный подход к извлечению нужной информации.

Проблема и решение

Ваша изначальная команда:

FOR /F %d IN ('DIR /B ^| FINDSTR interesting') DO ECHO %d:~0,-17%

не работает так, как ожидается, потому что в CMD переменные окружения, определенные в цикле FOR, не могут быть получены напрямую с помощью %variable%. Это связано с тем, что CMD подставляет значение переменной до начала выполнения команд в цикле.

Исправленный подход

Чтобы успешно извлечь нужные данные, можно использовать команду CALL в сочетании с правильным экранированием. Вот как можно это сделать:

В командной строке

FOR /F %d IN ('DIR /B ^| FINDSTR interesting') DO @SET "a=%d" & CALL ECHO %%a:~0,-16%%

В пакетном файле (batch file)

Если вы работаете в пакетном файле, следите за двумя вещами: используйте двойные знаки % для переменных, и добавьте команду SETLOCAL в начале, чтобы ограничить область видимости переменных:

@echo off
setlocal
FOR /F %%d IN ('DIR /B ^| FINDSTR interesting') DO SET "a=%%d" & CALL ECHO %%a:~0,-16%%
endlocal

Объяснение

  1. Команда FOR /F: В данной команде мы используем FOR /F, чтобы пройтись по всем строкам, полученным из DIR /B | FINDSTR interesting. Каждая строка будет сохранена в переменной %%d.

  2. Установка переменной: Мы устанавливаем переменную a, содержащую значение из %%d.

  3. Использование CALL: Команда CALL позволяет вызвать новую команду в контексте текущего интерпретатора. Это дает возможность правильно подставить значение переменной a на этапе выполнения, а не на этапе парсинга.

  4. Извлечение строки: Использовав синтаксис %%a:~0,-16%%, мы можем извлечь нужную часть строки. Этот синтаксис означает "вырезать строку с индекса 0 до 16 символов с конца".

Заключение

Используя предложенные методы, вы сможете эффективно извлекать необходимую информацию из имен директорий в Windows. Подобное решение обеспечит высокую гибкость и возможность адаптации под различные сценарии в будущем. Для достижения максимальной производительности стоит также обращать внимание на правильно настроенные пути и контексты выполнения команд.

Оцените материал
Добавить комментарий

Капча загружается...