Como posso substituir “cut” no prompt de comando do Windows?

4

Eu tenho um diretório com um conjunto de subpastas, que corresponde a um padrão de nome, como:

sub-123
sub-0815
sub-4711

Dentro desta pasta eu tenho alguns arquivos com o mesmo número no nome como foi encontrado no nome da pasta. por exemplo. a pasta sub-123 contém os arquivos

input-123
output-123

Eu quero iterar a pasta, alterar o diretório de trabalho para a pasta atual e fazer algum processamento com o conjunto de arquivos apropriado. Enquanto eu posso iterar as pastas com

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

Eu 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 de lote do Windows-7? No ambiente Linux, pode ser possível usar o comando cut ou qualquer expressão regular. Mas como devo ir no prompt de comando do Windows?

    
por harper 30.05.2012 / 18:56

2 respostas

1

Eu também encontrei uma resposta direta. Está perto do corte semântico.

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
)
    
por 31.05.2012 / 06:48
2

Eu encontrei sozinho. O comando set possui uma substituição de variável aprimorada. Mas não pode ser usado no próprio for body. É necessário iniciar um novo contexto de chamada de 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.

    
por 30.05.2012 / 19:39