Forum Pplware

Versão Completa: Ficheiro batch
Está de momento a ver uma versão reduzida do nosso conteúdo. Ver versão completa com o formato adequado.
Infelizmente os meus conhecimentos não são suficientes para programar um ficheiro batch que seja eficiente. Eu programei um, mas é muitíssimo básico e tem muitas linhas; pois é como sei. Se bem que com alguns problemas.

Bem, de qualquer das maneiras se alguém me pudesse ajudar, ficaria grato.

Eu pretendo um ficheiro batch que, em primeiro lugar, verifique se determinada pasta existe em %PROGRAMFILES%, e se sim, então eliminar todos os ficheiros que se encontran na pasta, bem como todas as subpastas e ficheiros nelas contidos, mas nunca eliminar a pasta principal.

Alguém me saberia dar indicações sobre como o conseguir?

Muito obrigado
Se não te preocupares que se queixe quando a directoria não existe, então é simples. Basta usares o seguinte comando:

Código:
del /F /S /Q %PROGRAMFILES%\directoria_a_limpar\*.*
(16-04-2011 10:21)Corvus Escreveu: [ -> ]Se não te preocupares que se queixe quando a directoria não existe, então é simples. Basta usares o seguinte comando:

Código:
del /F /S /Q %PROGRAMFILES%\directoria_a_limpar\*.*

Olá Corvus,

Desde já um muito obrigado pela tua disponibilidade em querer ajudar.

Em primeiro, é necessário colocar aspas nesse comando:

Código:
del /F /S /Q "%PROGRAMFILES%\directoria_a_limpar\*.*"

Caso contrário não funciona.

Acontece que, apesar de eliminar todos os ficheiros da pasta e sub-pastas, não elimina as sub-pastas.

Eu poderia adicionar algo como

Código:
rmdir /Q "%PROGRAMFILES%\directoria_a_limpar\sub_pasta_1/2/etc

que deveria funcionar. Ainda não experimentei. Contudo, o ideal seria eliminar todas as sub-pastas de uma só vez. Sabes como o fazer?

Agradeço mais uma vez a tua ajuda! Smile
Por acaso não tinha testado a ver se o del removia as directorias.

Esta alternativa não é tão "limpa" mas funciona:

Código:
rmdir /s /q "%PROGRAMFILES\dir_a_limpar"
mkdir "%PROGRAMFILES\dir_a_limpar"

Nota que eliminas e tornas a criar a directoria base, mas é a única maneira que estou a ver sem complicar muito o batch e sem saber antecipadamente o conteúdo da directoria
set pasta=%PROGRAMFILES%
;Define "pasta" com o directório a que queres realizar a acção
dir /b /ad %pasta% > direcs.txt
;Cria uma lista com os directórios encontradas na pasta principal
for /f %%i in (direcs.txt) do rd /s /q %pasta%\%%i
;Em cada directório encontra na lista, anteriormente criada, elimina-a
del /f /s /q %pasta%\*.*
;Elimina os ficheiros restantes no directório principal
del direcs.txt
;E por fim, elimina a lista criada

Isto faz uma lista de directórios da pasta pretendida, elimina-as e depois elimina de seguida os ficheiros... simples! Smile
Agora uma simples explicação dos comandos que utilizei...
"Dir" com o argumento "/b" faz com que a apresentação seja simples, apenas simboliza o nome dos directórios encontrados; "/ad" mostra apenas os ficheiros com atributos ("/a") de directório ("d"); E ">" vai escrever essa lista no ficheiro "directs.txt".
"Rd" com argumento "/s" faz com que elimine todos os directório da pasta e seus ficheiros; "/q" suprime as mensagens de confirmação.
"Del" com argumento "/f" elimina os ficheiros com atributos de leitura; "/s" elimina os ficheiros de todos os directórios, embora neste caso é desnecessário, visto que os directórios já foram eliminados; E "/q" modo silêncio, ou seja, suprime qualquer mensagem de confirmação da eliminação dos ficheiros.
A terceira linha não te sei explicar exactamente, não por escrito, mas é algo como "para cada %coisa% encontrado no 'ficheiro directorios.txt' faz eliminar"... Tongue Quando tiveres dificuldade em certos comando, faz "comando /?" que aparece todos os argumentos e exemplos desses mesmo comando...
Realmente é mesmo fraquinho o scripting em windows.. se percebi bem, isto em unix seria apenas um:
Código:
rm -r /caminho_da_pasta/*

A alternativa do Corvus parece-me boa, mas contra a parte de remover apenas se a pasta existir.. logo se a pasta não existir acho que não é suposto cria-la.

Em unix bastava por o comando de remover seguido de um && com o comando de criação de pasta a frente. Desta forma a criação de pasta só seria efectuada se a remoção ocorresse. Não sei se em windows existe este operando.

Quanto a solução do avlisrotiv.. é preciso guardar num ficheiro o output do dir para depois o utilizar? Não se pode fazer directamente no for? em unix faria algo do genero
Código:
for line in `ls /caminho_dir/`; do; rm -r $line; done;

Desculpem lá o paralelismo Tongue

cumps
URL's de Referência