Mover 1 arquivo de cada vez com base no timestamp usando o utilitário de lote do Windows

1

Estou tentando criar um arquivo .bat para mover arquivos de uma pasta para outra, com base no arquivo com registro de data e hora mais antigo.

Pasta 1 :

Filename:        Date Modified:
test1.dat        5/12/2014 4:03pm
test2.dat        5/12/2014 4:04pm

O objetivo é mover o arquivo mais antigo para a Pasta 2 . Atualmente, meu arquivo de lote abaixo move tudo da pasta 1 para a pasta 2, obviamente porque não tenho nenhum código relacionado ao tempo inserido.

set Delay=10
move /-y "C:\Users\bingersoll001\Desktop\folder1\*.dat" "C:\Users\bingersoll001\Desktop\folder2"
timeout 10 /nobreak
call move.bat

Existe alguma maneira de conseguir isso?

    
por Brian 13.05.2014 / 17:50

2 respostas

2

Supondo que você esteja usando uma versão relativamente recente do Windows (Vista ou mais recente), recomendo que você use o PowerShell. É muito mais fácil fazer esse tipo de tarefa lá. Você também pode instalar o PS no XP, se quiser.

gci | where {!$_.PSIsContainer} | sort LastWriteTime | select -f 1 | move -destination "C:\some\path\"

Ou se você tiver o PS 3.0 / Windows 8:

gci -file | sort LastWriteTime | select -f 1 | move -destination "C:\some\path\"

Explicação:

  • gci - abreviação de Get-ChildItem . Obtém todos os arquivos em um diretório. -file faz com que ele retorne apenas arquivos, sem diretórios. Analogamente a dir e ls .

  • where - abreviação de Where-Object . Filtre a entrada por alguma condição. Antes do PS 3.0, -file não existia para gci , então era necessário usar o filtro where .

  • sort - abreviação de Sort-Object crescente por LastWriteTime .

  • select - abreviação de Select-Object . Pegue somente o primeiro resultado ( -f 1 ).

  • move - abreviação de Move-Item . Move o resultado do pipeline anterior para a pasta -destination .

Mais ajuda disponível com o comando help <commandname> .

    
por 13.05.2014 / 18:12
2

O script em lote a seguir moverá o arquivo com o tempo de gravação mais antigo da pasta original para o arquivo de destino.

@echo off
setlocal

set source=C:\Users\bingersoll001\Desktop\folder1
set dest=C:\Users\bingersoll001\Desktop\folder2
set exts=*.dat

pushd "%source%"

for /f "delims=" %%G in ('dir /b /o:d %exts%') do (
move /-y "%%~G" "%dest%"
goto :break
)
:break

popd
endlocal & exit /b

Como funciona

  1. Desativa o recurso de eco de comando para uma saída menos detalhada.

    @echo off
    
  2. Faça qualquer alteração nas variáveis de ambiente locais do arquivo de lote.

    setlocal
    
  3. Defina uma nova variável local chamada source , que contém o caminho da pasta de origem.

    set source=C:\Users\bingersoll001\Desktop\folder1
    
  4. Semelhante à linha anterior, defina uma nova variável local para a pasta de destino.

    set dest=C:\Users\bingersoll001\Desktop\folder2
    
  5. Cria uma nova variável local que contém as extensões de arquivo a serem filtradas. Várias extensões devem ser separadas por um ponto e vírgula ( ; ).

    set exts=*.dat
    
  6. Altere a pasta de trabalho atual.

    pushd "%source%"
    
  7. Execute o comando dir /b /o:d /t:w %exts% e, em seguida, analise sua saída. O parâmetro /b , o comando dir exibe uma lista de arquivos sem cabeçalho ou resumo; /o:d torna a lista ordenada por data / hora (mais antiga primeiro). Por padrão, os arquivos são classificados pelo último tempo de gravação. A parte "delims=" é necessária para evitar problemas com caminhos de arquivos que contenham caracteres de espaço.

    for /f "delims=" %%G in ('dir /b /o:d %exts%') do (
    
  8. Mova o arquivo para a pasta de destino.

    move /-y "%%~G" "%dest%"
    
  9. Nenhum outro arquivo precisa ser processado; salte para o rótulo :break , saindo do loop for .

    goto :break
    
  10. Restaure a pasta de trabalho anterior e saia.

    popd
    endlocal & exit /b
    

Leitura adicional

por 13.05.2014 / 19:17