Pergunta

Eu estou tentando escrever um script em lotes de pequeno porte que vai apagar arquivos antigos arquivos de um diretório. O primeiro parâmetro é o diretório para o script para olhar para, eo segundo é o número de arquivos para preservar.

rem @ECHO OFF

rem %1 is the path in which to look for the files
rem %2 is the number of recent files to preserve

if [%1] EQU [] (
    echo ERROR: Missing Required Paramater directory path.
    goto :eof
)

if [%2] EQU [] (
    echo ERROR: Missing Required Paramater, number of files to preserve
    goto :eof
)

if %2 LSS 0 (
    echo ERROR: Number of files to preserve provided was negative
    goto :eof
)

set FolderPath=%1
set SafeNumber=%2

cd %FolderPath%

for /f %%f in ('dir /O-D /A-D /B') do call :delete %%f
goto :eof

:delete
if %SafeNumber% LEQ 0 (
    del %1
) else (
    set /a SafeNumber-=1
)
goto :eof

:eof

Essencialmente, o que eu tenho aqui é um dir que resulta em uma lista de nomes de arquivos ordenados do mais recente ao mais antigo. Dependendo do que SafeNumber é, ele irá ignorar os primeiros arquivos e, em seguida, PROCEDE com exclusão vez SafeNumber <= 0.

O problema que estou tendo agora, é se o nome do arquivo é "Test File.txt" (como em contém um espaço. "Test" é passado para a exclusão como% 1, em vez de "Test File.txt" .

Algumas ideias sobre como obter o meu script de trabalho, ou talvez alguém tem uma solução melhor escrito?

Foi útil?

Solução

Você já tentou colocar entre aspas o nome do arquivo na sua entrada, ou em seu script? Quero dizer em todo o% f ou% 1, para o script.

Outras dicas

Para espaços em branco punho em nomes de arquivos, etc. Você vai querer citar para nomes e caminhos "% 1" etc .... Talvez seja o seu único problema.

o seu vai ter que usar o comando find com rm -newer e depois -exec. Por exemplo, para excluir todos os arquivos mais recentes que file.txt fazer:

find . -type f -newer file.txt -exec rm {} \;

Há muito tempo atrás, eu escrevi um simples prog Java que é suposto ser iniciado a partir do console, ou seja, a partir de um arquivo de lote. O prog exclui os antigos arquivos de um diretório especificado. Confira aqui , eu realmente don 't lembro exatamente como ele funciona, mas eu sugiro usá-lo primeiro em uma pasta-teste. Supõe-se para ser usado para Windows, pelo menos lá é onde eu usei-o.

Agora eu mudei para um Mac, onde eu estou usando o seguinte Automator roteiro I lançamento a cada boot para fazer esse trabalho:

find /Users/<yourUser>/Downloads/* -type f -mtime +90 -exec mv -f {} /Users/<yourUser>/.Trash \;

Alterar seu loop for, e acabar com a sua função de exclusão.

for /f "skip=%safenum%" %%f in ('dir /o-d /a-d /b') do ( del %%f )

Eu tenho um amor doentio por loops ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top