Batch: supprimer sous répertoire sans supprimer le répertoire hôte

Batch: supprimer sous répertoire sans supprimer le répertoire hôte - Logiciels - Windows & Software

Marsh Posté le 23-11-2010 à 23:31:50    

Bonsoir
Voilà, je voudrais déplacer tout le contenu d'un répertoire "xx" (sous répertoires compris) dans un autre répertoire "yy". Et je voudrais que le répertoire "xx" soit complètement vide à la fin du transfert=>plus de sous répertoire ni de fichier!
 
P.S. Dans un répertoire "x", il peut y avoir des fichiers avec n'importe quels nom et extention, mais aussi des répertoires avec n'importe quels noms (même avec des espace).
 
et Précision! je ne peut pas effacé "xx" ni "yy" car ce sont des répertoires partagés.
 
 
J'ai écrit ça mais j'a pas l'impression que soit très orthodoxe!
 
set source=e:\ftp\xx\
set dest=e:\ftp\yy\
xcopy %source%*.* %dest% /y /s
@echo Suppression de tous les répertoire dans la source:
del /s /q %source%*.*
cd %source%
for /d %%i IN ("" ) DO rmdir /s /q %source%%%i
echo %%i
pause
 

Reply

Marsh Posté le 23-11-2010 à 23:31:50   

Reply

Marsh Posté le 24-11-2010 à 13:43:11    

Pour déplacer il faut utiliser la commande "move"
Cela évite de copier, puis de supprimer.

Reply

Marsh Posté le 24-11-2010 à 17:28:59    

j'ai essayé avec "move" mais ça ne déplace que les fichier du premier niveau sans déplacer les répertoire ni les fichiers qui se trouvent dans ces sous répertoire. :pfff:  


Message édité par hhgrouik26 le 24-11-2010 à 17:46:12
Reply

Marsh Posté le 24-11-2010 à 19:38:58    

c'est quand même fou qu'on ne puisse pas simplement effacer tout les répertoires contenus dans un répertoire "xx" sans suprimer ce répertoire "xx".
 
On y arrive très simplement avec del pour les fichiers, mais pour les répertoires c'est une autre paire de manche!

Reply

Marsh Posté le 24-11-2010 à 19:58:33    

avec ce code, cela devrait aller:
 

Code :
  1. Set _Source=e:\ftp\yy
  2. Set _Destination=e:\ftp\xx
  3. For /F "Tokens=* Delims=" %%I In ('Dir /B "%_Source%"') Do Move "%_Source%\%%I" "%_Destination%"

Reply

Marsh Posté le 25-11-2010 à 08:55:31    

aaaahhh quand même! ça fonctionne! Merci benoit363
 
Sinon j'ai trouvé ce batch qui fonctionne bien aussi pour supprimer tout le contenu d'un répertoire (sous répertoire compris) en gardant le répertoire racine:
for /f "Tokens=*" %%b in ('dir /B') do rd /s /q "%%b"

Reply

Marsh Posté le 25-11-2010 à 13:34:18    

Par contre je me retrouve maintenant bloqué sur le test de la présence de fichiers ou de répertoire dans "xx"
En effet, je voudrais verifier toute les 10mn par une tache si il y a des fichier dans le répertoire "xx". Et si il y a quelque chose à copier (fichier ou répertoire) je veut envoyer un mail et lancer la commande de déplacement de fichiers  
Par contre, je ne veut pas envoyer un mail si il n'y a rien à déplacer dans "xx".
 
J'ai essayé ça sans succès:
Set _Source=e:\ftp\yy
Set _Destination=e:\ftp\xx
If existe %source%\*.* (
For /F "Tokens=* Delims=" %%I In ('Dir /B "%_Source%"') Do Move "%_Source%\%%I" "%_Destination%"
sendmail.exe.....
) else (
exit
)
 
Évidement je ne connait pas les nom des fichiers ou répertoires qui peuvent être présent dans "xx"


Message édité par hhgrouik26 le 25-11-2010 à 13:36:25
Reply

Marsh Posté le 26-11-2010 à 17:57:48    

Ce code devrait permettre de le faire
 

Code :
  1. Set Source=e:\ftp\xx
  2. Set Destination=e:\ftp\yy
  3. Dir %Source%|Find /C "0 fichier"
  4. IF %ERRORLEVEL% == 1 Goto Transfert
  5. Dir %Source%|Find /C "2 R‚p"
  6. IF %ERRORLEVEL% == 1 (
  7. :Transfert
  8. For /F "Tokens=* Delims=" %%I In ('Dir /B "%Source%"') Do Move "%Source%\%%I" "%Destination%"
  9. REM Sendmail
  10. )


 
On fait une recherche si la commande DIR  sur le répertoire source retourne "0 Fichier"
Si ce n'est pas le cas, on transfert.
même chose pour les dossiers.
 
Il faut remplacer REM Sendmail par la bonne commande.


Message édité par benoit6363 le 26-11-2010 à 18:00:47
Reply

Marsh Posté le 26-11-2010 à 19:39:26    

Merci pour le code, mais je ne maîtrise pas toutes les notions que tu utilise comme le | ou bien je ne sais pas quand utiliser les '. Je ne sais jamais non plus quand on doit faire un appel de sous programme ou pas. j'etait resté bloqué car ma boucle for fonctionnait pas comme il faut dans mon if alors que en dehors, ça fonctionnais bien.
 
J'ai réussi après 2 jours à faire la même chose que toi en plus compliqué et en deux .bat. :) avec quelques petite choses en plus.
Il faudrait que je reprenne en fait mon script pour l'adapeter au tient qui est plus simple.
 
J'ai en fait utilisé un comptage de fichier dans mon répertoire:
puis je remplis le corps de mon futur message dans mon fichier corps.txt
Je copie tout dans un répertoire dépendant de la date du jour.
 
@echo off
Set Source=e:\ftp\xx
Set Destination=e:\ftp\yy
set script=e:\ftp\script
 
rem Suppression du fichier sendmail.log
del %script%\sendmail.log
 
rem Création du fichier "corps.txt" et du corps du message avec les noms des fichiers trouvé dans le répertoire source
title >%script%\corps.txt
echo on
for /f "tokens=*" %%b in ('dir %Source%\ /B') do echo %%b>>%script%\corps.txt
 
echo off
rem vérification de la présence de fichier ou de répertoire dans le répertoire source: si 0 fichier alors goto fin sinon on appel le fichier MoveFTP.bat
For /f "tokens=*" %%a in ('dir /B "%Source%\"') Do Set /A Compte+=1
If "%Compte%"=="" (
goto FIN2
) else (
call moveFTP.bat
goto MAIL
)
 
:MAIL
rem Parametres de l'email à envoyer pour sendmail
set sujet=De nouveaux PV sont arrives sur le FTP!
set exp=yyy@yyy.com
set destinataire=xxx.xxx@xxx.com
set corps=%script%\corps.txt
set port=25
set smtp=194.2.0.81
 
rem Execution en ligne de commande de sendmail.exe (/l permet de masquer la fenêtre de  message en fin d’envoi de email)
%script%\sendmail.exe /m:%corps% /u:%destinataire% /t:%sujet% /e:%exp% /l /p:%port% /s:%smtp%
:FIN
 
moveftp.bat:
 
rem Decomposition de la date
Set DD=%date:~0,2%
Set MM=%date:~3,2%
Set YY=%date:~6,4%
 
rem Creation du répertoire année\Mois\jour en utilisant la date du jour
mkdir "%Destination%\%YY%\%MM%\%DD%\"
 
rem déplacement des fichiers et répertoires de %source% vers %destination% saisis dans le fichier sendmailFTP.bat
For /F "Tokens=* Delims=" %%i In ('Dir /B "%Source%"') Do Move /y "%Source%\%%i" "%Destination%\%YY%\%MM%\%DD%\"
 
 
Le soucis qui me reste à résoudre maintenant est l'envoi de mail par smtp mais avec authentification, car apparemment il faut qu'on s'authentifie. Le soucis c'est que je ne sais pas si ça peut se gérer par bat! En tout cas sendmail ne gère pas l'authentification smtp. sniff!!!
 
Connaîtrais-tu un soft d'envoi de mail qui gère ça ou bien un morceau de code en batch pour faire ça?
 
Merci pour ton aide en tout cas!


Message édité par hhgrouik26 le 26-11-2010 à 19:40:10
Reply

Marsh Posté le 27-11-2010 à 20:13:53    

Pas mal ton batch,
il est très évolué, avec un fichier log, et création d'un répertoire avec la date du jour.
 
Pour Sendmail, j'avais aussi essayé de le faire fonctionner sans succès.
Peut-être, tu peux utiliser un net send pour envoyé un message à l'utilisateur, mais c'est pas le top.
 
en tout cas, si tu arrives à faire fonctionner Sendmail ou autre,
Cela m'interesse.
 
Salutations.
 

Reply

Marsh Posté le 27-11-2010 à 20:13:53   

Reply

Marsh Posté le 27-11-2010 à 23:48:39    

Merci, mais tu y est en parti pour quelque chose :) et puis j'ai pas mal récupéré des morceaux de batch que j'ai pu trouvé et adapté à mes besoins.
 
Pour ce qui est de sendmail, il n'est pas prévu pour faire de l'authentification, mais j'ai eu son créateur par mail, Damien Ponel http://www.dipisoft.com/ que je félicite et remercie pour tout le travail qu'il fait gratuitement et fait un très bon suivit de ses soft!
Apparemment il est en train de modifier sendmail pour l'adapter à l'authentification et le ssl.

Reply

Marsh Posté le 02-12-2010 à 11:05:13    

salut benoit6363,
Ca y est, j'ai réussit à faire tourner sendmail avec une version beta (merci à damien de dipisoft) qui devrait très bientôt être mis à jour.
 
Le dernier soucis que j'ai c'est que avec mes 2 batch, je n'arrive pas à déplacer un répertoire (avec un fichier dedans ou pas) de %source% vers %destination% si il existe déjà un répertoire avec le même nom. J'ai un message "Accès refusé".
je vois pas de quoi ça vient vu que j'ai mis /y pour répondre par oui à l'écrasement de fichier! Il n'a pas l'air de faire pareille pour les répertoires.
 
Ou bien, j'ai un problème dans mon batch: Je demande de le remplacer alors que peut-être il est utilisé par quelque chose dans mon batch. Mais je vois pas où!
 
pour résumer:
Donc dans le répertoire source "xx" j'ai un répertoire avec un fichier.txt: e:\ftp\xx\a\fichier.txt
et dans mon répertoire de destination "yy", j'ai aussi un répertoire "a" mais vide: e:\ftp\yy\a\
Et bien le déplacement du fichier.txt ne se fait pas et reste dans la source!!! :fou:  
 
j'ai essayé just le batch moveftp.bat et voilà ce que ça me répond:
 
E:\FTP\script>rem Decomposition de la date
E:\FTP\script>Set DD=02
E:\FTP\script>Set MM=12
E:\FTP\script>Set YY=2010
 
E:\FTP\script>rem Creation du rÚpertoire annÚe\Mois\jour en utilisant la date du
 jour
E:\FTP\script>mkdir "e:\ftp\yy\2010_12\02\"
Un sous-répertoire ou un fichier e:\ftp\yy\2010_12\02\ existe déjà.
 
E:\FTP\script>rem dÚplacement des fichiers et rÚpertoires de e:\ftp\xx vers e:\f
tp\yy saisis dans le fichier sendmailFTP.bat
E:\FTP\script>For /F "Tokens=* Delims=" %i In ('Dir /B "e:\ftp\xx"') Do Move /y
"e:\ftp\xx\%i" "e:\ftp\yy\2010_12\02\"
 
E:\FTP\script>Move /y "e:\ftp\xx\a" "e:\ftp\yy\2010_12\02\"
Accès refusé.
 
E:\FTP\script>pause
Appuyez sur une touche pour continuer...
 
Sinon j'ai aussi essayé avec robocopy:
"%robocopy%\robocopy.exe" "%Source%" "%Destination%\%YY%_%MM%\%DD%" /E /move
 
Là si les fichiers et répertoires à déplacer existent déjà dans la destination, alors rien ne se passe. Et si les fichiers et répertoires n'existent pas, il me déplace bien tout (répertoires et fichiers), et répertoire parent compris! alors que je ne veut pas toucher au répertoire parent.
 
Même avec l'option exclure un répertoire (ici le répertoire parents ça ne fonctionne pas:
"%robocopy%\robocopy.exe" "%Source%" "%Destination%\%YY%_%MM%\%DD%" /E /move /xd xx


Message édité par hhgrouik26 le 02-12-2010 à 14:42:58
Reply

Marsh Posté le 02-12-2010 à 16:41:26    

Ca y est j'ai enfin finit par trouver une solution qui fonctionne!!!!! :bounce:  
 
j'ai du utiliser robocopy!
c'est une solution peut orthodoxe mais qui fonctionne.
j'ai en fait crée un répertoire dans mon répertoire source, et dans robocopy, j'ai exclu ce répertoire du "move" avec l'option /xd
Donc comme il reste un répertoire, il ne supprime pas le répertoire parent (%source%). C'est la seul astuce que j'ai trouvé.
 
pour forcer le déplacement de fichier et de répertoire déjà existant, j'ai utilisé le paramètre /is.
 
Voilà tout fonctionne bien maintenant. Merci à toi benoit.

Reply

Marsh Posté le 03-12-2010 à 13:10:58    

Effectivement, la commande "move" ne fonctionne pas avec un dossier existant,
C'est quand même bizarre qu'il ait pas prévu le cas.
 
Heureusement, que tu as pu contourner le problème avec Robocopy.
 
Salutations  :hello:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed