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

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

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 forpró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
)

informação relacionada