4

У меня есть каталог с набором подпапок, соответствующих шаблону имени, например:

sub-123
sub-0815
sub-4711

Внутри этих папок у меня есть несколько файлов с тем же номером на имени, который был найден в имени папки. например, папка sub-123 содержит файлы

input-123
output-123

Я хочу перебрать папку, изменить рабочую папку на текущую и выполнить некоторую обработку с соответствующим набором файлов. Хотя я могу перебирать папки с

for /d %%d in (sub-*) do .

Мне нужна часть имени папки, которая соответствует звездочке, в приведенном выше примере "123". Как я могу извлечь 123 из имени папки и построить команду, как

cd sub-123
copy input-123 output-123

внутри пакетного файла Windows-7? В среде Linux может быть возможно использовать команду cut или любое регулярное выражение. Но как мне перейти в командной строке Windows?

2 ответа2

2

Я нашел это сам. Команда set имеет расширенную подстановку переменных. Но он не может быть использован в for самого тела. Необходимо начать новый контекст вызова бакты:

for /d %%d in (sub-*) do (
  set item=%%d
  pushd %%d
  call :build
  popd
)
goto :eof

:build
  set item=%item:sub-=%
  copy input-%item% output-%item%
:eof

"Элемент" не совсем построен из строки, сопоставленной со звездочкой, но он эквивалентен.

1

Я нашел также прямой ответ. Это близко к семантике.

Команда set также имеет синтаксис подстроки. Чтобы пропустить n символов, используйте %variable:~n% . Чтобы получить n символов, начиная со смещения k, используйте %variable:~k,n%

for /d %%d in (sub-*) do (
  set item=%%d
  set num=%item:~4%
  pushd %%d
  copy input-%num% output-%num%
  popd
)

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