Tentando copiar apenas arquivos com nome de três caracteres, mas isso está copiando qualquer coisa menor

1

Estou usando 'copy' em uma janela de console no Windows XP Pro (então estou usando basicamente os comandos do DOS)

Eu tenho arquivos com três caracteres mais uma extensão e arquivos com dois caracteres mais uma extensão. Eu tenho o seguinte em um arquivo em lote ms-dos ...

copy ???.gif n:\inetpub\wwwroot\images

que, no que diz respeito ao meu entendimento dos curingas do Windows / dos, deve copiar APENAS os arquivos que possuem três caracteres em seu nome. Mas está copiando os arquivos com dois caracteres também.

Meu entendimento deve estar errado, então há outra maneira em um arquivo de lote ms-dos de limitar uma cópia a apenas arquivos com um número específico de caracteres em seu nome?

    
por MrVimes 05.10.2011 / 16:59

3 respostas

2

Para selecionar apenas os arquivos desejados, você precisa envolver expressões regulares. Uma maneira de fazer isso é usar o comando findstr. ( link )

Para obter os comandos de saída juntos, parece um pouco feio, mas o formato básico é o seguinte:

for /f "delims=" %a in ('dir /b ^| findstr "\<[a-z][a-z][a-z].gif"') do copy %a n:\inetpub\wwwroot\images

Para explicar um pouco:

for /f "delims=" %a in

Esta é a configuração para que cada parte da saída do comando no '()' seja colocada em% a

('dir /b ^| findstr "\<[a-z][a-z][a-z].gif"')

Este comando usa o diretório dir / b para obter uma listagem dos arquivos no diretório atual e passa para o findstr. findstr procura linhas de entrada que correspondam ao seguinte padrão: Elas contêm uma palavra que inicia (\ <) com três letras ([a-z] [a-z] [a-z]) seguidas de .gif (.txt).

do copy %a n:\inetpub\wwwroot\images

Isto copia o arquivo cujo nome está em% a.

    
por 05.10.2011 / 18:06
1

o ? significa um caractere ou NULL no final do nome do arquivo.

Então o BA ??. TXT corresponderá a BARR.TXT e BAR.TXT. Como você está usando 3 ? , ele também corresponderá a 2 caracteres e 1 caractere ...

No Windows Vista há um comando para copiar chamado robocopy e tem a opção de excluir alguns arquivos. Você poderia tentar:

robocopy ???.txt c:\temp\ /xf??.TXT

mas não tenho certeza de que funcionará no Windows XP

    
por 05.10.2011 / 17:27
0

Você pode fazer isso desta maneira:

@echo off
setlocal EnableDelayedExpansion
for %%f in (???.gif) do (
    set filename=%%f
    set fourthchar=!filename:~3,1!
    if !fourthchar! == . copy %%f n:\inetpub\wwwroot\images
)

Ou seja, copie arquivos que tenham três caracteres antes do ponto.

    
por 26.10.2011 / 06:54