sauvegarde fichier.bat avec xcopy, problème au passage heure d'été

Roland_M

XLDnaute Barbatruc
bonsoir à tous,

je me suis concocté un petit classeur qui me crée un fichier batch
pour mes sauvegardes de données sur n'importe quel disque/clé externe.
tout ceci automatiquement avec choix source, destination ainsi que les dossiers aux choix.

mais je rencontre toujours ce même problème lors du passage à l'heure d'été,
tous les fichiers sur le disque passe à cette heure !? encore une m..de de windows !
sur mes disques externes ntfs ça ne pose pas de problème car eux aussi s'affichent avec cette nouvelle heure
qui, selon moi, est une véritable aberration !?

mais sur mes clés usb fat 32, les fichiers restent à l'heure réelle de sauvegarde
exemple 25/03/2014 19:50 alors que sur C: c'est devenu 25/03/2014 20:50
de ce fait xcopy se met à tout remplacer puisque les fichiers sont considérés plus récents.

j'ai donc voulu passer out en mettant une date au lieu /D: simplement
j'ai essayé de mettre D:date (pour éviter le test sur l'heure plus récente)

mon problème cette fois est le suivant, impossible de faire fonctionner cette option !?
voilà mes options /D /E /I /H /R /Y (ce qui n'est pas le problème)
je veux par exemple mettre /D:date /E /I /H /R /Y
pour la date j'ai essayé toutes les possibilités, mais rien n'y fait !?

je connais assez bien les fichiers.bat et dieu sait que j'ai cherché sur le net mais ...
j'ai fais les essais suivants: jj-mm-aaaa et aaaa-mm-jj soit yyyy-mm-dd
avec des guillemets puis avec(-) puis avec(/)
/D:28-03-2014
/D:28-03-14
/D:2014-03-28
/D:14-03-28
idem ci-dessus avec les guillements
/D:"28-03-2014"
...
puis idem avec / et ensuite avec "
/D:28/03/2014
/D:"28/03/2014"
...
j'ai donc fais le tour, mais rien n'a fonctionné !? toujours erreur: paramètre non valide !?

question: pourquoi ou comment procéder ?
ou encore, astuce pour échapper à cette merdouille de changement d'heure ?

merci d'avance à tous ceux qui se pencheront sur ce problème !
j'ai même essayé de reculer l'heure du pc mais rien n'y fait !
 
Dernière édition:

Misange

XLDnaute Barbatruc
Re : sauvegarde fichier.bat avec xcopy, problème au passage heure d'été

Bonjour Roland
Pas de soluce à te proposer avec un fichier batch mais ... freefilesync, gratuit, super pratique et paramétrable pour faire les sauvegardes sans y penser.
 

Roland_M

XLDnaute Barbatruc
Re : sauvegarde fichier.bat avec xcopy, problème au passage heure d'été

bonjour à tous,

j'ai enfin trouvé la solution !
le bon format est: mois-jour-annee
soit pour 28-03-2014
/D:03-28-2014

franchement !? quand je dis que c'est de m..de, c'est bien de la m..de
 

Staple1600

XLDnaute Barbatruc
Re : sauvegarde fichier.bat avec xcopy, problème au passage heure d'été

Bonjour à tous

Roland_M
Hum! çà sent bon le batch ici ;)
(souvenirs, souvenirs)

Sinon quand le batch donne du fil à retordre, on peut basculer vers le monde merveilleux du vbscript.
(ou mieux du powershell sur les OS récents)
 

Roland_M

XLDnaute Barbatruc
Re : sauvegarde fichier.bat avec xcopy, problème au passage heure d'été

bonjour à tous,

Salut à toi Staple !
j'ai solutionné en formatant tout mes support ntfs (j'ai préféré reformater que convertir)

pour les sauvegardes je n'aime pas les automatismes ! j'aime bien garder la main et contrôler par moi même !
mon fichier batch fonctionne à merveille. je le crée depuis excel ainsi j'ai tous les paramètres que je souhaites et surtout le choix des dossiers sources et destinations (voir image)

j'ai un disque C: system SSD avec le system où là j'effectue une sauvegarde image
et un disque D: données avec mes documents images favoris utilitaires . . .

mes supports de sauvegarde contiennent les mêmes dossiers que sur mon D:
auquel j'ai rajouté SVG_ exemple SVG_Documents
tout ceci est géré et créé par mon bat selon les options et l'état de la destination !?

imag.jpg

création du bat:
Code:
'toutes vars déclarées public sont init dans userform
Private Sub CreatFichSaveAvecBatch(DatSvg$, DisqDestinSvg$)
' création du fichier.bat
NoF = FreeFile
Open PathNomDuFichierBat$ For Output As #NoF
Print #NoF, "@echo off"
Print #NoF, "break on"
Print #NoF, "mode con: COLS=120"

Print #NoF, "Rem ---------------------------------------- Nbr dossiers selon Disq/CleUsb ---"
Print #NoF, "SET NbrDeDossierSvg=" & Trim(NbrDeDossierSvgAvecOption)
Print #NoF, "SET LectDestin=" & LettreDuDisqDestin2P$
Print #NoF, "SET MsgDestin=" & FConvCaractWinEnDos(MsgDisqDestin$)

Print #NoF, "Rem ---------------------------------------- Vars pour tous ---"
Print #NoF, "SET NoDuDossier=0"
Print #NoF, "SET EspacesAff=" & Guillemet2$
Print #NoF, "SET PathSource=" & Guillemet2$
Print #NoF, "SET PathDestin=" & Guillemet2$
Print #NoF, "SET Options=" & Guillemet2$
Print #NoF, "SET Reponse=" & Guillemet2$

Print #NoF, "Rem ---------------------------------------- Vars des dossiers en ordre ---"
'boucle init tablo et écrit les SET PathSource(no) et destin
ReDim IfNoDossierOptSvg$(1 To NbrDeDossierSvgAvecOption)
ReDim IfNoDossierSource$(1 To NbrDeDossierSvgAvecOption)
ReDim IfNoDossierDestin$(1 To NbrDeDossierSvgAvecOption)
ReDim IfNoEspacesAffich$(1 To NbrDeDossierSvgAvecOption)
ReDim EchoNoDossierCopi$(1 To NbrDeDossierSvgAvecOption)
NbrSpaceMax = 0
For I = 1 To NbrDeDossierSvgAvecOption
  L = Len(TabloSource(I)): If L > NbrSpaceMax Then NbrSpaceMax = L
Next
For I = 1 To NbrDeDossierSvgAvecOption
  'ici n'arrive pas OptionSvgIgnorer$
  If TabloOption(I) = OptionSvgDemander$ Then OptionSave$ = "D"
  If TabloOption(I) = OptionSvgCopiRecentAuto$ Then OptionSave$ = "C"
  If TabloOption(I) = OptionSvgRecopiToutAuto$ Then OptionSave$ = "R"
  xPathSource$ = TabloSource(I): xPathSource$ = FConvCaractWinEnDos(xPathSource$)
  xPathDestin$ = TabloDestin(I): xPathDestin$ = FConvCaractWinEnDos(xPathDestin$)
  NbrEspace = NbrSpaceMax - Len(xPathSource$) 'space maxi nom dossier ci-dessus
  IfNoEspacesAffich$(I) = "IF %NoDuDossier%==" & Trim(I) & " SET " & "EspacesAff=%EspacesAff" & Trim(I) & "%"
  IfNoDossierOptSvg$(I) = "IF %NoDuDossier%==" & Trim(I) & " SET " & "OptionSave=%OptionSave" & Trim(I) & "%"
  IfNoDossierSource$(I) = "IF %NoDuDossier%==" & Trim(I) & " SET " & "PathSource=%PathSource" & Trim(I) & "%"
  IfNoDossierDestin$(I) = "IF %NoDuDossier%==" & Trim(I) & " SET " & "PathDestin=%PathDestin" & Trim(I) & "%"
  EchoNoDossierCopi$(I) = "echo source %PathSource" & Trim(I) & "%" & Space(NbrEspace) & " destin " & "%PathDestin" & Trim(I) & "%"
  Print #NoF, "SET EspacesAff" & Trim(I) & "=" & Space(NbrEspace)
  Print #NoF, "SET OptionSave" & Trim(I) & "=" & OptionSave$
  Print #NoF, "SET PathSource" & Trim(I) & "=" & LettreDuDisqSource2P$ & Guillemet1$ & xPathSource$ & Guillemet1$
  Print #NoF, "SET PathDestin" & Trim(I) & "=" & LettreDuDisqDestin2P$ & Guillemet1$ & xPathDestin$ & Guillemet1$
Next
Print #NoF, "Rem --------------------------------------- DEPART TEST LECTEURS ---"
Print #NoF, "IF exist %LectDestin% GOTO GoDisqueOk"
Print #NoF, "echo."
Print #NoF, "echo Lecteur %LectDestin% de destination non connect‚ !?"
Print #NoF, "GoTo Quitter"
Print #NoF, ""
Print #NoF, ":GoDisqueOk"
Print #NoF, "echo COPIER au choix les Dossiers Source " & NomDuDisqSource$ & " " & LettreDuDisqSource2P$ & "\ destination %MsgDestin%"
Print #NoF, "echo ------ ASTUCE POUR QUITTER EN URGENCE Taper Ctrl+C"
'n'affiche plus
'For I = 1 To NbrDeDossierSvgAvecOption: Print #NoF, EchoNoDossierCopi$(I): Next
Print #NoF, "echo."
Print #NoF, "rem --------------------------------------- Boucle Dossiers ---"
Print #NoF, "SET NoDuDossier=0"
Print #NoF, ":BoucleDossierSuivant"
Print #NoF, "SET PathSource=" & Guillemet2$
Print #NoF, "SET PathDestin=" & Guillemet2$
Print #NoF, "IF %NoDuDossier%==%NbrDeDossierSvg% GOTO Quitter"
Print #NoF, "SET /a NoDuDossier=%NoDuDossier%+1"
For I = 1 To NbrDeDossierSvgAvecOption
  Print #NoF, IfNoEspacesAffich$(I)
  Print #NoF, IfNoDossierOptSvg$(I)
  Print #NoF, IfNoDossierSource$(I)
  Print #NoF, IfNoDossierDestin$(I)
Next
Print #NoF, ""
Print #NoF, "Rem ----------------- si le rep existe: supprimer et copier ou copier les fich.récents"
Print #NoF, "IF exist %PathDestin% goto SauvegardeRepExistant"
Print #NoF, "Rem ----------------- sinon demande pour créer et copier le dossier !?"
Print #NoF, "echo source %PathSource% %EspacesAff%destin %PathDestin% %EspacesAff% qui N'EXISTE PAS ..."
'impose création si Copier ou Remplacer sinon demander ?
Print #NoF, "SET Reponse=C"
Print #NoF, "IF /i %OptionSave%==D SET Reponse=" & Guillemet2$
Print #NoF, "IF /i %OptionSave%==D SET /P Reponse=Voulez-vous le (C)r‚er+(C)opier le contenu  (Q)uitte (enter)suivant ? "
Print #NoF, "echo."
Print #NoF, "IF /i %Reponse%==Q GOTO Quitter"
Print #NoF, "IF /i %Reponse%==C GOTO CreatDir"
Print #NoF, "GoTo BoucleDossierSuivant"
Print #NoF, ""
Print #NoF, "Rem ------------------"
Print #NoF, ":SauvegardeRepExistant"
Print #NoF, "echo source %PathSource% %EspacesAff%destin %PathDestin% %EspacesAff% qui  existe d‚j… ..."
Print #NoF, "SET Reponse=%OptionSave%"
Print #NoF, "IF /i %OptionSave%==D SET Reponse=" & Guillemet2$
Print #NoF, "IF /i %OptionSave%==D SET /P Reponse=(C)opier les fich.r‚cents (R)emplacer tout  (Q)uitte (enter)suivant ? "
Print #NoF, "echo."
Print #NoF, "IF /i %Reponse%==Q GOTO Quitter"
Print #NoF, "IF /i %Reponse%==C GOTO CopierRecents"
Print #NoF, "IF /i %Reponse%==R GOTO RemplacerTout"
Print #NoF, "GoTo BoucleDossierSuivant"
Print #NoF, ""
Print #NoF, ":CopierRecents"
If DatSvg$ = "" Then
   Print #NoF, "SET Options=" & OptionXCOPY1$
Else
   DatXcopy$ = Format(DatSvg$, "mm-dd-yyyy")
   Print #NoF, "SET Options=/D:" & DatXcopy$ & OptionXCOPY2$
End If
Print #NoF, "XCOPY %PathSource% %PathDestin% %Options%"
Print #NoF, "GoTo MsgFinSaveDossierSuivant"
Print #NoF, ""
Print #NoF, "Rem ---------- demande supp rep.existant!? si ok suppr/recree/copie tout!? sinon suite dossier suivant"
'supp / Q sans confirmation
Print #NoF, ":RemplacerTout"
Print #NoF, "SET Options=/S /Q"
Print #NoF, "IF /i %OptionSave%==D SET Options=/S"
Print #NoF, "IF /i %OptionSave%==D echo Confirmez le remplacement complet de %PathDestin% !"
Print #NoF, "RMDIR %Options% %PathDestin%"
Print #NoF, "IF exist %PathDestin% goto PasseMsgFinSaveDossierSuivant"
Print #NoF, ""
Print #NoF, "Rem ---------- suite ci-dessus et arrivée pour création !? ---"
Print #NoF, ":CreatDir"
Print #NoF, "MKDIR %PathDestin%"
Print #NoF, "IF not exist %PathDestin% goto ErreurRep"
Print #NoF, "SET Options=/E /I /H"
Print #NoF, "XCOPY %PathSource% %PathDestin% %Options%"
Print #NoF, "GoTo MsgFinSaveDossierSuivant"
Print #NoF, ""
Print #NoF, "Rem ---------- message fin sauvegarde -------------------"
Print #NoF, ":MsgFinSaveDossierSuivant"
Print #NoF, "echo."
Print #NoF, "echo.... Sauvegarde %PathSource% termin‚e !"
Print #NoF, "echo."
Print #NoF, ":PasseMsgFinSaveDossierSuivant"
Print #NoF, "echo."
Print #NoF, "GoTo BoucleDossierSuivant"
Print #NoF, ""
Print #NoF, "Rem ---------- erreur a la creation du rep ---------------"
Print #NoF, ":ErreurRep"
Print #NoF, "echo."
Print #NoF, "echo Erreur lors de la cr‚ation du r‚pertoire %PathDestin%"
Print #NoF, "echo."
Print #NoF, "GoTo BoucleDossierSuivant"
Print #NoF, ""
Print #NoF, "Rem ---------- quitte programme --------------------------"
Print #NoF, ":Quitter"
Print #NoF, "echo."
Print #NoF, "echo................"
Print #NoF, "echo Fin sauvegarde. Appuyez sur une touche pour quitter !"
Print #NoF, "pause > nul"
Print #NoF, "del " & PathNomDuFichierBat$
Close #NoF
'! exécution !
Shell PathNomDuFichierBat$, vbMaximizedFocus

'save nom du disque et date de sauvegarde
Sheets(NomDeLaFeuilMemo$).Select
Lig = 2
While Sheets(NomDeLaFeuilMemo$).Cells(Lig, 1) > "": Lig = Lig + 1: Wend
Sheets(NomDeLaFeuilMemo$).Cells(Lig, 1) = Now
Sheets(NomDeLaFeuilMemo$).Cells(Lig, 2) = DatSvg$
Sheets(NomDeLaFeuilMemo$).Cells(Lig, 3) = DisqDestinSvg$
End Sub

Private Function FConvCaractWinEnDos(M$) As String
MM$ = M$
For I = 1 To 11 'é(‚) è(Š) ê(ˆ) ë(‰) à(…) â(ƒ) ä(„) ù(—) û(–) ü(š) ç(‡)
  CarWin$ = Choose(I, "é", "è", "ê", "ë", "à", "â", "ä", "ù", "û", "ü", "ç")
  CarDos$ = Choose(I, "‚", "Š", "ˆ", "‰", "…", "ƒ", "„", "—", "–", "š", "‡")
  MM$ = Replace(MM$, CarWin$, CarDos$)
Next
FConvCaractWinEnDos = MM$
End Function

Private Function FConvCaractDosEnWin(M$) As String
MM$ = M$
For I = 1 To 11 'é(‚) è(Š) ê(ˆ) ë(‰) à(…) â(ƒ) ä(„) ù(—) û(–) ü(š) ç(‡)
  CarDos$ = Choose(I, "‚", "Š", "ˆ", "‰", "…", "ƒ", "„", "—", "–", "š", "‡")
  CarWin$ = Choose(I, "é", "è", "ê", "ë", "à", "â", "ä", "ù", "û", "ü", "ç")
  MM$ = Replace(MM$, CarDos$, CarWin$)
Next
FConvCaractDosEnWin = MM$
End Function

exemple du fichier bat, selon les options choisies !?
(les caractères accentués qui n'apparaissent pas ici sont ok sous dos)
Code:
@echo off
break on
mode con: COLS=120
Rem ---------------------------------------- Nbr dossiers selon Disq/CleUsb ---
SET NbrDeDossierSvg=1
SET LectDestin=G:
SET MsgDestin=Cl‚ Usb G:
Rem ---------------------------------------- Vars pour tous ---
SET NoDuDossier=0
SET EspacesAff=""
SET PathSource=""
SET PathDestin=""
SET Options=""
SET Reponse=""
Rem ---------------------------------------- Vars des dossiers en ordre ---
SET EspacesAff1=
SET OptionSave1=C
SET PathSource1=E:"\Documents"
SET PathDestin1=G:"\SVG_Documents"
Rem --------------------------------------- DEPART TEST LECTEURS ---
IF exist %LectDestin% GOTO GoDisqueOk
echo.
echo Lecteur %LectDestin% de destination non connect‚ !?
GoTo Quitter

:GoDisqueOk
echo COPIER au choix les Dossiers Source DATA E:\ destination %MsgDestin%
echo ------ ASTUCE POUR QUITTER EN URGENCE Taper Ctrl+C
echo.
rem --------------------------------------- Boucle Dossiers ---
SET NoDuDossier=0
:BoucleDossierSuivant
SET PathSource=""
SET PathDestin=""
IF %NoDuDossier%==%NbrDeDossierSvg% GOTO Quitter
SET /a NoDuDossier=%NoDuDossier%+1
IF %NoDuDossier%==1 SET EspacesAff=%EspacesAff1%
IF %NoDuDossier%==1 SET OptionSave=%OptionSave1%
IF %NoDuDossier%==1 SET PathSource=%PathSource1%
IF %NoDuDossier%==1 SET PathDestin=%PathDestin1%

Rem ----------------- si le rep existe: supprimer et copier ou copier les fich.récents
IF exist %PathDestin% goto SauvegardeRepExistant
Rem ----------------- sinon demande pour créer et copier le dossier !?
echo source %PathSource% %EspacesAff%destin %PathDestin% %EspacesAff% qui N'EXISTE PAS ...
SET Reponse=C
IF /i %OptionSave%==D SET Reponse=""
IF /i %OptionSave%==D SET /P Reponse=Voulez-vous le (C)r‚er+(C)opier le contenu  (Q)uitte (enter)suivant ? 
echo.
IF /i %Reponse%==Q GOTO Quitter
IF /i %Reponse%==C GOTO CreatDir
GoTo BoucleDossierSuivant

Rem ------------------
:SauvegardeRepExistant
echo source %PathSource% %EspacesAff%destin %PathDestin% %EspacesAff% qui  existe d‚j… ...
SET Reponse=%OptionSave%
IF /i %OptionSave%==D SET Reponse=""
IF /i %OptionSave%==D SET /P Reponse=(C)opier les fich.r‚cents (R)emplacer tout  (Q)uitte (enter)suivant ? 
echo.
IF /i %Reponse%==Q GOTO Quitter
IF /i %Reponse%==C GOTO CopierRecents
IF /i %Reponse%==R GOTO RemplacerTout
GoTo BoucleDossierSuivant

:CopierRecents
SET Options=/D /E /I /H /R /Y
XCOPY %PathSource% %PathDestin% %Options%
GoTo MsgFinSaveDossierSuivant

Rem ---------- demande supp rep.existant!? si ok suppr/recree/copie tout!? sinon suite dossier suivant
:RemplacerTout
SET Options=/S /Q
IF /i %OptionSave%==D SET Options=/S
IF /i %OptionSave%==D echo Confirmez le remplacement complet de %PathDestin% !
RMDIR %Options% %PathDestin%
IF exist %PathDestin% goto PasseMsgFinSaveDossierSuivant

Rem ---------- suite ci-dessus et arrivée pour création !? ---
:CreatDir
MKDIR %PathDestin%
IF not exist %PathDestin% goto ErreurRep
SET Options=/E /I /H
XCOPY %PathSource% %PathDestin% %Options%
GoTo MsgFinSaveDossierSuivant

Rem ---------- message fin sauvegarde -------------------
:MsgFinSaveDossierSuivant
echo.
echo.... Sauvegarde %PathSource% termin‚e !
echo.
:PasseMsgFinSaveDossierSuivant
echo.
GoTo BoucleDossierSuivant

Rem ---------- erreur a la creation du rep ---------------
:ErreurRep
echo.
echo Erreur lors de la cr‚ation du r‚pertoire %PathDestin%
echo.
GoTo BoucleDossierSuivant

Rem ---------- quitte programme --------------------------
:Quitter
echo.
echo................
echo Fin sauvegarde. Appuyez sur une touche pour quitter !
pause > nul
del E:\SaveDossiersDataTEMPXYZ.bat
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re : sauvegarde fichier.bat avec xcopy, problème au passage heure d'été

Bonjour à tous

Roland_M
Ça c'est du batch de derrière les fagots ;)
Merci pour ce retour

Néanmoins je nous encourage* à découvrir les possibilités offertes par powershell ;)
Un exemple parmi moults
Script Using Powershell to Robocopy folders from point A to point B
et un tuto
http://www.dsfc.net/wp-content/uploads/supports/support-powershell-3-0.pdf

*: à réserver pour des lectures les nuits sans lunes ou les jours de pluies en sirotant un thé au gingembre
en écoutant quelque musique datant de la même époque queMSDOS ;) (voire avant)
On peut rajouter pour le cliché:
un feu de bois dans la cheminée, un bon fauteuil qui sent sent le cuir usé etc...
 
Dernière édition:

Discussions similaires

Réponses
2
Affichages
243