Eu tenho um diretório com um conjunto de subpastas, correspondendo a um padrão de nome, como:
sub-123
sub-0815
sub-4711
Dentro destas pastas tenho alguns arquivos com o mesmo número no nome que foi encontrado no nome da pasta. por exemplo, a pasta sub-123 contém os arquivos
input-123
output-123
Quero iterar a pasta, alterar o diretório de trabalho para a pasta atual e fazer algum processamento com o conjunto apropriado de arquivos. Embora eu possa iterar as pastas com
for /d %%d in (sub-*) do .
Preciso da parte do nome da pasta que corresponde ao asterisco, no exemplo acima "123". Como posso extrair o 123 do nome da pasta e criar um comando como
cd sub-123
copy input-123 output-123
dentro de um arquivo em lote do Windows-7? No ambiente Linux pode ser possível usar o comando cut ou qualquer expressão regular. Mas como devo entrar no prompt de comando do Windows?
Responder1
Eu encontrei sozinho. O comando set possui uma substituição de variável aprimorada. Mas não pode ser usado no for
próprio corpo. É necessário iniciar um novo contexto de chamada 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
O "item" não é exatamente construído a partir da string que corresponde ao asterisco, mas é equivalente.
Responder2
Encontrei também uma resposta direta. Está próximo da semântica do corte.
O comando set também possui uma sintaxe de substring. Para pular n caracteres use %variable:~n%
. Para obter n caracteres começando no deslocamento k use%variable:~k,n%
for /d %%d in (sub-*) do (
set item=%%d
set num=%item:~4%
pushd %%d
copy input-%num% output-%num%
popd
)