У меня есть каталог с набором подпапок, соответствующих шаблону имени, например:
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?
решение1
Я нашел его сам. Команда set имеет расширенную подстановку переменных. Но ее нельзя использовать в for
самом теле. Необходимо начать новый контекст вызова bacth:
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
«Элемент» не полностью создан из строки, сопоставившейся со звездочкой, но он эквивалентен.
решение2
Я также нашел прямой ответ. Он близок к сокращенной семантике.
Команда 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
)