Você descobriu um dos banimentos herdados dos dias do DOS. ROBOCOPY
não está adicionando um caractere curinga à extensão, mas está combinando com o nome 8.3 curto do arquivo.
De volta ao dia, os nomes de arquivos eram limitados a um nome de base com tamanho máximo 8, seguido por uma extensão de comprimento máximo 3. Quando os recursos de nomes de arquivos longos eram adicionados, era necessário um método para permitir que programas antigos continuassem funcionando com os nomes longos. Assim, todos os arquivos que não atendem à especificação 8.3 receberam automaticamente um nome abreviado alternativo que atende à especificação.
Os nomes curtos ainda sobrevivem até hoje, e o sistema operacional corresponde automaticamente a nomes de arquivos com caracteres curinga nos nomes longos e curtos.
Portanto, um nome de arquivo como somename.txt-long
se torna algo como SOMEFI~1.TXT
. Você pode ver porque esse nome curto corresponde à sua máscara de arquivo.
Infelizmente, não há como evitar que o ROBOCOPY (ou qualquer outro comando nativo) corresponda ao nome abreviado. Como os nomes 8.3 causam problemas como o que você está enfrentando, muitos administradores de sistema desabilitam nomes 8.3, especialmente em um ambiente corporativo.
Se os seus arquivos estiverem armazenados em um volume NTFS, e se você executar o console como administrador, poderá desativar os nomes 8.3 com FSUTIL
. Isso pode ser feito em todo o sistema ou em uma base por volume. No entanto, isso só impede que novos nomes 8.3 sejam criados - os nomes 8.3 existentes ainda persistem. Você também pode usar FSUTIL
para remover nomes 8.3 existentes, mas há possíveis problemas de registro que podem causar problemas. Eu nunca usei o comando, então não sei todos os meandros.
Sem desabilitar nomes 8.3, a única solução que conheço é processar os arquivos usando seu próprio loop FOR /F
, juntamente com DIR /B
canalizado para FINDSTR
para eliminar arquivos com extensões maiores que 3. Você também deve forneça o comando para processar cada arquivo correspondente individualmente. Algo como:
for /f "eol=: delims=" %F in ('dir /b /a-d *.txt^|findstr /lie ".txt"') do @someCommand "%F" ...
O exemplo acima processaria todos os arquivos .txt dentro do diretório atual. Pode haver uma quantidade razoável de ajustes para que o comando faça exatamente o que você deseja. Além disso, as porcentagens precisariam ser duplicadas se você usar o comando em um script em lote.