Backup Skript - Fragen....

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

just me
Posts: 9423
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Backup Skript - Fragen....

14 May 2021, 08:44

Moin @BoBo,
wie ich das sehe, startet er Robocopy nicht direkt sondern innerhalb eines CMD-Fensters. Fehler sollten deshalb dort sichtbar sein, es sei denn, deren Anzeige wird durch Robocopy-Optionen verhindert.
Best-Code-in-Use
Posts: 184
Joined: 01 Dec 2015, 05:13
Location: Germany

Re: Backup Skript - Fragen....

14 May 2021, 08:58

Ja jetzt ist zumindest etwas zu sehen...
Es sieht aus als ob ein " zu viel oder zu wenig ist, oder?
FEHLER: Es wurde kein Zielverzeichnis angegeben.
----------------------------
-------------------------------------------------------------------------------
ROBOCOPY :: Robustes Dateikopieren für Windows
-------------------------------------------------------------------------------

Gestartet: Freitag, 14. Mai 2021 15:54:00
Quelle : C:\Users\Mr-7\Scoutsystems" D:\test \UNICODE \S \E \DCOPY:DA \COPY:DAT \PURGE \MIR \MT:4 \R:5 \W:30 \UNILOG+:D:\test\zzz_Log_Copied_files.txt\
Ziel -

Dateien : *.*

Optionen: *.* /DCOPY:DA /COPY:DAT /R:1000000 /W:30

------------------------------------------------------------------------------

FEHLER: Es wurde kein Zielverzeichnis angegeben.

Einfache Syntax :: ROBOCOPY Quelle Ziel /MIR

Quelle :: Quellverzeichnis (Laufwerk:\Pfad oder
\\Server\Freigabe\Pfad)
Ziel :: Zielverzeichnis (Laufwerk:\Pfad oder
\\Server\Freigabe\Pfad)
/MIR :: Spiegelt eine vollständige Verzeichnisstruktur.

Weitere Informationen erhalten Sie über den Befehl "ROBOCOPY /?"


**** Der Befehl "/MIR" kann Dateien sowohl kopieren als auch LÖSCHEN.
Und hier das Skript noch einmal=
autohotkey-robocopy-test
Greetings Best-Code-in-Use
just me
Posts: 9423
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Backup Skript - Fragen....

14 May 2021, 10:04

Ich bin mir nicht sicher, aber der abschließende Backslash in Quelle_001 könnte ein Problem sein.
Best-Code-in-Use
Posts: 184
Joined: 01 Dec 2015, 05:13
Location: Germany

Re: Backup Skript - Fragen....

14 May 2021, 11:12

@just me
Genau, das war es, vielen Dank!
Zwar bleibt wieder die Logfile Problematik mit den Umlauten, aber bekanntlich kann man nicht Alles haben!
Greetings Best-Code-in-Use
just me
Posts: 9423
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Backup Skript - Fragen....

14 May 2021, 12:42

Ich weiß immer noch nicht, bei welcher Gelegenheit für Dich ein 'Umlautproblem' entsteht.

Ansonsten:
Du weißt schon, dass die Option

Code: Select all

\UNILOG+:D:\test\zzz_Log_Copied_files.txt ; + hängt die Daten an eine vorhandene Datei an
das neue LOG an ein bestehendes anhängt?
Best-Code-in-Use
Posts: 184
Joined: 01 Dec 2015, 05:13
Location: Germany

Re: Backup Skript - Fragen....

14 May 2021, 12:45

Falls es Jemand gebrauchen kann=

Code: Select all

#NoTrayIcon ; Das AHK Symbol wird nicht angezeigt
; #NoEnv ; Nicht nachsehen, ob leere Variablen evtl. Umgebungsvariablen sind, beschleunigt die Laufzeit
#SingleInstance force ; Bei Neustart des Scriptes die alte Instanz ohne Nachfrage ersetzen
; SetWorkingDir %A_ScriptDir% ; Dateioperationen finden im Scriptverzeichnis statt, falls kein Pfad angegeben wird!
; #Warn


Quelle_001 := "C:\Users\" A_UserName "\Scoutsystems" 
Ziel_001 := "D:\test"

; Kopierbefehl = Robocopy "%Quelle_001%" "%Ziel_001%" /E /R:10 /W:5 /MT:2 /UNICODE /UNILOG+:"%Ziel_001%\zzz_Log_Copied_files.txt"
Kopierbefehl := A_WinDir . "\System32\Robocopy.exe """ . Quelle_001 . """ """ . Ziel_001 . """ /S /E /DCOPY:DA /COPY:DAT /PURGE /MIR /MT:8 /R:5 /W:30 /XF *.log /UNICODE /UNILOG+:""" . Ziel_001 . "\zzz_Logfile_Copy.log"""

; runwait, %comspec% /k %Kopierbefehl%, ,Hide
runwait, %comspec% /c %Kopierbefehl%, , Hide

; MsgBox, 262144, = Immer im Vordergrund (WS_EX_TOPMOST-Style) (Wie System Modal, aber ohne Icon in der Titelleiste) 
MsgBox, 262144, >> Backup erfolgreich, ###########################################`n###########################################`n`n`nDer Faktura Kopiervorgang ist abgeschlossen!`n`n`n###########################################`n###########################################


ExitApp
Ziel und Quelle lassen sich natürlich beliebig austauschen.
Nach wie vor besteht hier aber das Problem mit den Umlauten im Logfile.
Da aber die Kopie trotzdem einwandfrei ist, könnte das vernachlässigt werden...

Mit den Optionen für Robocopy kann entsprechend experimentiert werden.
Hier mal eine deutsche Anleitung=
https://www.tecchannel.de/a/robocopy-daten-schnell-und-einfach-unter-windows-sichern,2033515,2
Bei Produktivverzeichnissen ist selbstverständlich Vorsicht geboten!
Greetings Best-Code-in-Use
Best-Code-in-Use
Posts: 184
Joined: 01 Dec 2015, 05:13
Location: Germany

Re: Backup Skript - Fragen....

14 May 2021, 21:48

@just me

...das folgende Umlautproblem in der Robocopy Logdatei=
Dies-ist-ein-Test-ber-die™rger„rgelšPSIE.txt
Dateiname (es war ein Test versteht sich)= :dance:
Dies-ist-ein-Test-über-dieÖrgerärgelÜPSIE.txt
Das Problem wird auch hier beschrieben=

https://qastack.com.de/superuser/295934/robocopy-unilog-output-is-gibberish

Manchmal ist es nicht nachvollziehbar...
Ich habe jetzt das "+" Zeichen entfernt.
Dieses sorgt ja lediglich dafür, wie Du zuvor schon geschrieben hast, das eine neue Logdatei an die alte Logdatei angehängt wird, und jetzt funktioniert die Erzeugung der Logdatei korrekt...
:facepalm:
Kopierskript
Greetings Best-Code-in-Use
User avatar
jNizM
Posts: 3183
Joined: 30 Sep 2013, 01:33
Contact:

Re: Backup Skript - Fragen....

17 May 2021, 02:40

Ein paar Vorschläge noch:

- Befehl /mir (Spiegelt eine Verzeichnisstruktur wieder (äquivalent zu /e und /Purge))
Wenn du /mir verwendest kannst du eigtl /e und /purge weg lassen.

- Befehl /MT:[:n] (Erstellt multithreadkopien mit n Threads. n muss eine ganze Zahl zwischen 1 und 128 sein.)
Wenn es ein handelsüblicher Rechner mit (i5 oder höher) ist und es viele kleinere Dateien sind, würde ich /MT:4 oder /MT:8 verwenden
Bei einem PC mit i7 oder höher oder sogar einem Server gerne auch /MT:16


Ref: https://docs.microsoft.com/de-de/windows-server/administration/windows-commands/robocopy
[AHK] v2.0.5 | [WIN] 11 Pro (Version 22H2) | [GitHub] Profile
garry
Posts: 3736
Joined: 22 Dec 2013, 12:50

Re: Backup Skript - Fragen....

18 May 2021, 09:09

EDIT 20210520 : 2nd logfile Zusammenfassung nur "Neue Datei / Neuer / Neues Verz."

vielen Dank für eure Hilfe
Hier ein Beispiel mit GUI , auch ohne robocopy-Logfile-Befehl ( logfile mit CMDRET )
EDIT = dies entfernt >> unten kann man noch DOS Befehle eingeben

teadrinker's CMDRET zeigt alles richtig an , auch chinesische Characters
2nd logfile Zusammenfassung nur "Neue Datei / Neuer / Neues Verz." ( Beispiel für 2 Folder )

Code: Select all

================================
  Gestartet: Donnerstag, 20. Mai 2021 11:49:48
   Quelle : D:\M_YVONNE\
     Ziel : F:\_BEELINK\M_YVONNE\
--------------------------
	    Neue Datei		    7468 2021/03/07 15:13:00	D:\M_YVONNE\多线程系统代理下载tube1080p视频_20210307161303.ahk
--------------------------
           Insgesamt   Kopiert   Skipped  No match    FEHLER    Extras
Verzeich.:       109         0       109         0         0        39
  Dateien:      1457         1      1456         0         0       117
    Bytes:   4.443 g     7.2 k   4.443 g         0         0 1020.71 m
   Zeiten:   0:00:00   0:00:00                       0:00:00   0:00:00
Geschwindigkeit:              240903 Bytes/Sek.
Geschwindigkeit:              13.784 Megabytes/Min.
   Beendet: Donnerstag, 20. Mai 2021 11:49:49
================================ ENDXX ================================
================================
  Gestartet: Donnerstag, 20. Mai 2021 11:49:51
   Quelle : C:\users\garry\desktop\
     Ziel : F:\_BEELINK\DESKTOP\
--------------------------
	         Neuer		   12422 2021/05/20 09:49:18	C:\users\garry\desktop\FAV_TEST\ROBOCOPY\Robocopy_TEST_09.ahk
	    Neue Datei		   81895 2021/05/20 09:46:51	C:\users\garry\desktop\ROBOCOPY_LOG\20210520114651_Robocopy_Log_cmdret.txt
	    Neue Datei		    1819 2021/05/20 09:46:52	C:\users\garry\desktop\ROBOCOPY_LOG\20210520114652_Robocopy_New.txt
--------------------------
           Insgesamt   Kopiert   Skipped  No match    FEHLER    Extras
Verzeich.:       260         0       260         0         0        52
  Dateien:      3119         3      3116         0         0       336
    Bytes:  996.06 m    93.8 k  995.97 m         0         0   2.128 g
   Zeiten:   0:00:00   0:00:00                       0:00:00   0:00:00
Geschwindigkeit:             3101161 Bytes/Sek.
Geschwindigkeit:             177.449 Megabytes/Min.
   Beendet: Donnerstag, 20. Mai 2021 11:49:52
================================ ENDXX ================================

Ich habe am Kleinstcomputer 2 Laufwerke, C:\ und D:\ , beim Anschliessen eines Harddisks an USB soll es auf Laufwerk E:\ bzw. x-beliebig der nächste HD , z.B. auf Harddisk Q:\ kopieren

Hier ein Beispiel um 2 Ordner zu kopieren , es wird angezeigt was kopiert werden soll und welcher Ordner grad kopiert wird
EDIT : erstellt 2 logfiles : alles / nur Neue / geänderte

Code: Select all

;============ ROBOCOPY ==============================================
;MODIFIED = 20210520
;CREATED  = 20210401
;- example robocopy for computer with 2 drives  C:\ and D:\ >> copy to followed drive 'X'
;- changes  =
;- logfile wird durch CMDRET ( from user teadrinker ) erstellt
;- 2nd logfile nur für "Neue Datei/Neuer/Neues Verz." 
;====================================================================
;#warn
#Noenv
Setworkingdir,%a_scriptdir%
;----------------------------
gosub,drivegetshow
;----------------------------
;----------------------------

total:=2
;-------------- example copy 2 folders to next drive X ----------------
source1=%a_desktop%\TEST2             ;   C:\users\garry\desktop\TEST2
dest1  =%last%_BEELINK\DESKTOP\TEST2  ;   E:\_BEELINK\DESKTOP\TEST2           ( lastdrive example E:\  or another drive letter after C:\ and D:\ )
;--------
source2=%seclast%M_GARRY\GAMES        ;-  D:\M_GARRY\GAMES 
dest2  =%last%_BEELINK\M_GARRY\GAMES  ;-  E:\_BEELINK\M_GARRY\GAMES
;-----------------------------------------------------------------------
alldest=%source1% >> %dest1%`n%source2% >> %dest2%`n
;========================================================================



fd1=%a_desktop%\ROBOCOPY_LOG
ifnotexist,%fd1%
   filecreatedir,%fd1%
;----------------------------
;============== GUI ===========
name1:="DOS_TEST"
global name1
e:=""
cpx:="cp65001"
Gui,1:default
Gui,1: -DPIScale 
Gui,1:Color,Black,Black
wa:=A_screenwidth,ha:=A_screenHeight,xx:=100
;- maybe change fontsize
;============ GUISIZEx DPIx 4Kx 3840*2160 is 100% ============
if (wa=3840)
 Gui,1:Font,s12 cYellow,Lucida Console
;============ GUISIZEx DPIx FHD 1920*1080 is 100% ============
else if (wa=1920)
 Gui,1:Font,s10 cYellow,Lucida Console
else
 Gui,1:Font,s8 cYellow,Lucida Console
;=============================================================

;------------------------------------------------------------
x:=(wa*1)/xx,y:=(ha*1)/xx,  w:=(wa*18)/xx,h:=(ha*8)/xx
Gui, Add, Edit, x%x%   y%y%  w%w% h%h% vE1 readonly ,%alldrives%       ;- show All_Drives
;------------------------------------------------------------
x:=(wa*20)/xx,y:=(ha*1)/xx,  w:=(wa*40)/xx,h:=(ha*10)/xx
Gui, Add, Edit, x%x%   y%y%  w%w% h%h% vE2  ,%alldest%
;------------------------------------------------------------
x:=(wa*61)/xx,y:=(ha*1)/xx,  w:=(wa*7)/xx,h:=(ha*2.3)/xx
Gui, Add, Button, x%x%   y%y%  w%w% h%h% vRunx gRunCopy,RUN-COPY       ;- RUN-ROBOCOPY
;------------------------------------------------------------
x:=(wa*61)/xx,y:=(ha*4.1)/xx,w:=(wa*7)/xx,h:=(ha*2.3)/xx
Gui, add, Edit, x%x%  y%y% w%w%  h%h% vED3 readonly,                   ;- message running /ENDED
;------------------------------------------------------------
;x:=(wa*61)/xx,y:=(ha*7)/xx,w:=(wa*5)/xx,h:=(ha*2.3)/xx
;Gui,add,button, x%x%  y%y% w%w%  h%h% gPrintx, PRINT                   ;- PRINT
;------------------------------------------------------------
;x:=(wa*67)/xx,y:=(ha*7)/xx,w:=(wa*5)/xx,h:=(ha*2.3)/xx
;Gui,add,button, x%x%  y%y% w%w%  h%h% gPrintNew, PRINT_NEW             ;- PRINT NEW
;------------------------------------------------------------
x:=(wa*1)/xx,y:=(ha*12)/xx,  w:=(wa*72)/xx,h:=(ha*10)/xx
Gui, Add, Edit, x%x%   y%y%  w%w% h%h% vED0 readonly                   ;- which folder is already copied
;------------------------------------------------------------
x:=(wa*1)/xx,y:=(ha*22.5)/xx,w:=(wa*72)/xx,h:=(ha*70)/xx
Gui, Add, Edit, x%x%   y%y%  w%w% h%h% vED1 readonly +0x0400           ;- here the output
;------------------------------------------------------------
Gui,add,text,x0 y0 w0 h0 vTextdummy
x:=(wa*.1)/xx,y:=(ha*.1)/xx,w:=(wa*75)/xx,h:=(ha*95)/xx
Gui, Show,x%x% y%y% w%w% h%h%,%name1%
;------------------------------------------------------------
GuiControl,1: Focus,textdummy
return
;-------------------------
Guiclose:
Exitapp
esc::exitapp
;-------------------------
;==========================================================
RUNCOPY:
;- UMLAUT and chinese characters OK
Gui,1:submit,nohide
;---------------------------
;- beelink must have at least DRIVE >D
if ((vt>2) and (type1="Removable" or type1="Fixed"))   ;- if more then 2 drives & lastDrive is removable/ or fixed ( maybe USB-stick )
{
   msgbox, 262436,COPY-%seclast% to %last% ,%alldrives%`n-------------`nWant you COPY =`n%alldest%  ?
   IfMsgBox,No
       return
e:=""
enew:=""
e2:=""
Guicontrol,1:,ED0
Guicontrol,1:,ED1
Guicontrol,1:,ED3,running...
;--------- for TEST robocopy logfile : --------
logfile2 =%fd1%\%a_now%_Robocopy_Log.txt
excludex2=%logfile2%
;----------------------------------------------
;-----------
loop,%total%
{
guicontrolget,ed0
src:=% source%a_index%
dst:=% dest%a_index%
e2:=ed0 . "`n" . src . ">>>" . dst
Guicontrol,1:,ED0,%e2%
sleep,100
GuiControl,1: Focus,ED0
send,^{end}
sleep,100
;---------------------
;cmdx=chcp 65001&robocopy "%src%" "%dst%" /XO /E /TEE /NP /UNICODE /UNILOG+:%logfile2% /XD %excludex2%
cmdx=chcp 65001&robocopy "%src%" "%dst%" /XO /E /TEE /NP /UNICODE /FP /TS                                        
;----------------------
ed2a:="cmd /c " . cmdx
xxc:=cmdret(ED2a,,CPX)
sleep,400
e .="`r`n=========================== START ===================================`r`n" . cmdx . " =`r`n-------------------------------`r`n" . xxc . "`r`n================================ ENDXX ================================`r`n"
sleep,100
Guicontrol,1:,ED1,%e%
sleep,100
GuiControl,1: Focus,ED1
send,^{end}
}
Guicontrol,1:,ED3,ENDED
gosub,printx
sleep,1000
gosub,printnew
}
return
;===================================================================



;-------------------------
printnew:
f11=%fd1%\%a_now%_Robocopy_New.txt
Gui,1:submit,nohide
i=0
z=0
if e<>
{
 Loop,parse,e,`n,`r
  {
  x:=a_loopfield
  if x=
    continue     
  i++
  ;-----------------------------------------------------
  if x contains Gestartet
     { 
     enew .= "================================`r`n"
     z=1
     I=0
     }
   if (z=1)
    {
    enew .= x . "`r`n" 
    if (i=2)
     {
     z=0
     enew .= "--------------------------`r`n"
     }
    }
  ;------------------------------------------------------
  if x contains Insgesamt
     { 
     enew .= "--------------------------`r`n"
     K=1
     }
   if (K=1)
    {
    enew .=  x . "`r`n" 
    if x contains ENDXX
     K=0
    }
   ;----------------------------------------------------
  stringmid,xx,x,1,29
  if (xx ~= "Neuer|Neue Datei|Neues Verz")
    enew .= x . "`r`n" 
  }
xxa:="   Skipped"
xxb:="  No match"
stringreplace,enew,enew,Übersprungen ,%xxa%,all
stringreplace,enew,enew,Keine Übereinstimmung ,%xxb%,all
if enew<>
 {
 fileappend,%enew%,%f11%,utf-8
 try
  run,%f11%
 enew:=""
 }
else
 msgbox, 262208,COPY-NEW ,File not created because not found text=`nNeuer|Neue Datei|Neues Verz
}
return
;---------------------------
/*
================================
  Gestartet: Donnerstag, 20. Mai 2021 11:49:48
   Quelle : D:\M_YVONNE\
     Ziel : F:\_BEELINK\M_YVONNE\
--------------------------
	    Neue Datei		    7468 2021/03/07 15:13:00	D:\M_YVONNE\多线程系统代理下载tube1080p视频_20210307161303.ahk
--------------------------
           Insgesamt   Kopiert   Skipped  No match    FEHLER    Extras
Verzeich.:       109         0       109         0         0        39
  Dateien:      1457         1      1456         0         0       117
    Bytes:   4.443 g     7.2 k   4.443 g         0         0 1020.71 m
   Zeiten:   0:00:00   0:00:00                       0:00:00   0:00:00
Geschwindigkeit:              240903 Bytes/Sek.
Geschwindigkeit:              13.784 Megabytes/Min.
   Beendet: Donnerstag, 20. Mai 2021 11:49:49
================================ ENDXX ================================
================================
  Gestartet: Donnerstag, 20. Mai 2021 11:49:51
   Quelle : C:\users\garry\desktop\
     Ziel : F:\_BEELINK\DESKTOP\
--------------------------
	         Neuer		   12422 2021/05/20 09:49:18	C:\users\garry\desktop\FAV_TEST\ROBOCOPY\Robocopy_TEST_09.ahk
	    Neue Datei		   81895 2021/05/20 09:46:51	C:\users\garry\desktop\ROBOCOPY_LOG\20210520114651_Robocopy_Log_cmdret.txt
	    Neue Datei		    1819 2021/05/20 09:46:52	C:\users\garry\desktop\ROBOCOPY_LOG\20210520114652_Robocopy_New.txt
--------------------------
           Insgesamt   Kopiert   Skipped  No match    FEHLER    Extras
Verzeich.:       260         0       260         0         0        52
  Dateien:      3119         3      3116         0         0       336
    Bytes:  996.06 m    93.8 k  995.97 m         0         0   2.128 g
   Zeiten:   0:00:00   0:00:00                       0:00:00   0:00:00
Geschwindigkeit:             3101161 Bytes/Sek.
Geschwindigkeit:             177.449 Megabytes/Min.
   Beendet: Donnerstag, 20. Mai 2021 11:49:52
================================ ENDXX ================================
*/
;--------------------------
printx:
Gui,1:submit,nohide
logfile1 =%fd1%\%a_now%_Robocopy_Log_cmdret.txt
if e<>
 {
 e:=Trim(RegExReplace(e, "`am)^(?!.*[[:alnum:]]).*\R+"), "`r`n")
 fileappend,%e%,%logfile1%,UTF-8
 try
  run,%logfile1%
 ;e:=""
 }
return
;==========================

;--------------------------------------------------------------------------------------------------------
drivegetshow:
i=0
alldrives:=""
DriveGet, A, List,
StringSplit,D, A,
loop,%d0%
{
DRV:= % d%a_index% . ":\"
i++
      DriveGet       , type1   , type     , %DRV%     ;- removable / fixed
      DriveGet       , cap1    , capacity , %DRV%
      DrivespaceFree , free1   ,            %DRV%
      DriveGet       , fs1     , fs       , %DRV%     ;- FAT
      DriveGet       , label1  , label    , %DRV%     ;- volume label >\\server1
      DriveGet       , serial1 , serial   , %DRV%     ;- volume serial number
      DriveGet       , status1 , status   , %DRV%
alldrives .= drv . "  " . type1 . "  FREE=" . free1 . "-MB`n"
;msgbox, 262208,Drive-Info_%i% ,%DRV%  %type1%  %label1%  %fs1%  %cap1%-MB  %free1%-MB  %status1%
}
stringtrimright,alldrives,alldrives,1
VT:=D0       ;- totaldrives
VL:=(D0-1)   ;- totaldrives-1
 last         = %drv%

if (VT>2)
{
loop,%vl%
 seclast    := % d%a_index% . ":\"
Guicontrol,1:,ED1,%alldrives%
;msgbox, 262208,Info ,Alldrives=`n%alldrives%
}
else
 {
 msgbox, 262208,ERROR-SAVE ,You need more than 2 drives for robocopy  (computer BEELINK)`n`nAlldrives=`n%alldrives%
 exitapp
 }
return
;---------------------------------------------------------------------------------------------


;================= function from user teadrinker ========================================
;- https://www.autohotkey.com/boards/viewtopic.php?p=369467#p369467
CmdRet(sCmd, callBackFuncObj := "", encoding := "CP0")
{
   static HANDLE_FLAG_INHERIT := 0x00000001, flags := HANDLE_FLAG_INHERIT
        , STARTF_USESTDHANDLES := 0x100, CREATE_NO_WINDOW := 0x08000000
   hPipeRead:=""
   hPipeWrite:=""
   sOutput:=""
   DllCall("CreatePipe", "PtrP", hPipeRead, "PtrP", hPipeWrite, "Ptr", 0, "UInt", 0)
   DllCall("SetHandleInformation", "Ptr", hPipeWrite, "UInt", flags, "UInt", HANDLE_FLAG_INHERIT)
   
   VarSetCapacity(STARTUPINFO , siSize :=    A_PtrSize*4 + 4*8 + A_PtrSize*5, 0)
   NumPut(siSize              , STARTUPINFO)
   NumPut(STARTF_USESTDHANDLES, STARTUPINFO, A_PtrSize*4 + 4*7)
   NumPut(hPipeWrite          , STARTUPINFO, A_PtrSize*4 + 4*8 + A_PtrSize*3)
   NumPut(hPipeWrite          , STARTUPINFO, A_PtrSize*4 + 4*8 + A_PtrSize*4)
   
   VarSetCapacity(PROCESS_INFORMATION, A_PtrSize*2 + 4*2, 0)
   if !DllCall("CreateProcess", "Ptr", 0, "Str", sCmd, "Ptr", 0, "Ptr", 0, "UInt", true, "UInt", CREATE_NO_WINDOW
                              , "Ptr", 0, "Ptr", 0, "Ptr", &STARTUPINFO, "Ptr", &PROCESS_INFORMATION)
   {
      DllCall("CloseHandle", "Ptr", hPipeRead)
      DllCall("CloseHandle", "Ptr", hPipeWrite)
      throw Exception("CreateProcess is failed")
   }
   DllCall("CloseHandle", "Ptr", hPipeWrite)
   VarSetCapacity(sTemp, 4096), nSize := 0
   while DllCall("ReadFile", "Ptr", hPipeRead, "Ptr", &sTemp, "UInt", 4096, "UIntP", nSize, "UInt", 0) {
      sOutput .= stdOut := StrGet(&sTemp, nSize, encoding)
      ;sOutput .= stdOut := StrGet(&sTemp, nSize)
      ;sOutput .= stdOut := StrGet(&sTemp, nSize, CPX)
      ( callBackFuncObj && callBackFuncObj.Call(stdOut) )
   }
   DllCall("CloseHandle", "Ptr", NumGet(PROCESS_INFORMATION))
   DllCall("CloseHandle", "Ptr", NumGet(PROCESS_INFORMATION, A_PtrSize))
   DllCall("CloseHandle", "Ptr", hPipeRead)
   Return sOutput
}
;================= END SCRIPT ========================================================================


;===================== NOTICE ========================================================================
/*
;- https://www.autohotkey.com/boards/viewtopic.php?f=9&t=90409
;- https://www.autohotkey.com/boards/viewtopic.php?f=10&t=71336
;- https://www.wintotal.de/download/yarcgui/
;- https://www.tecchannel.de/a/robocopy-daten-schnell-und-einfach-unter-windows-sichern,2033515
*/
;=====================================================================================================

garry
Posts: 3736
Joined: 22 Dec 2013, 12:50

Re: Backup Skript - Fragen....

20 May 2021, 05:08

EDIT 20210520 : erstellt 2 logfiles : alles + nur Neue / geänderte
Best-Code-in-Use
Posts: 184
Joined: 01 Dec 2015, 05:13
Location: Germany

Multithread Systemlast - SSD - HDD

21 May 2021, 02:16

@jNizM
Befehl /MT:[:n] (Erstellt multithreadkopien mit n Threads. n muss eine ganze Zahl zwischen 1 und 128 sein.)
Wenn es ein handelsüblicher Rechner mit (i5 oder höher) ist und es viele kleinere Dateien sind, würde ich /MT:4 oder /MT:8 verwenden
Bei einem PC mit i7 oder höher oder sogar einem Server gerne auch /MT:16
Vielen Dank für die Hinweise, allerdings sollte man immer bedenken, mit welcher Art von Festplatten man arbeitet.
Es ist einfach nicht gesund für herkömmliche Festplatten, eine sehr starke Systemlast zu verursachen.
Bei SSD´s allerdings kann mindestens /MT: 8 Verwendung finden.

Weiterhin sollte geprüft werden, ob die Systemlast den normalen Arbeitsablauf behindert.
Nach meinen Tests kann mit /MT: 2 auch an älteren Rechnern nicht viel schief gehen.
Greetings Best-Code-in-Use
Best-Code-in-Use
Posts: 184
Joined: 01 Dec 2015, 05:13
Location: Germany

Re: Backup Skript - Fragen....

15 Mar 2022, 05:03

@All

ich bräuchte bitte noch einmal etwas Hilfe...
Wie kann ich denn mehrere Ordner ausschließen (Im Zielverzeichnis)?
Der Schalter lautet: /XD die Syntax in Robocopy ist auch klar, aber im Skript will es sich mir nicht erschließen...

Code: Select all

Kopierbefehl_A := A_WinDir . "\System32\Robocopy.exe """ . Quelle_001 . """ """ . Ziel_A . """ /E /PURGE /MIR /MT:2 /R:5 /W:10 /XF *.logfile /XD """ . Logfiles . """  """ . Logfiles_Kopie . """ /UNICODE /UNILOG:""" . Logfiles . "Backup-A.logfile"""
Die Verzeichnisse Logfiles und Logfiles_Kopie sollen ausgeschlossen werden, aber ich bekomme es nicht zum laufen.
Es besteht offenbar ein Syntax Fehler.
Nur der Ordner Logfiles wird verschont, hat Jemand eine Idee für mich?

Zur Syntaxerklärung für Robocopy ist hier ein sehr guter Artikel verfasst.
https://pureinfotech.com/exclude-files-folders-robocopy-windows-10/
Greetings Best-Code-in-Use
just me
Posts: 9423
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Backup Skript - Fragen....

15 Mar 2022, 05:37

Moin,

was steht denn in den Variablen Logfiles und Logfiles_Kopie?
Best-Code-in-Use
Posts: 184
Joined: 01 Dec 2015, 05:13
Location: Germany

Re: Backup Skript - Fragen....

15 Mar 2022, 05:55

So, jetzt ist es schon fast perfekt...
(Natürlich fehlt jetzt noch die Abfrage von Laufwerken, etc.)
Allerdings besteht noch die Ordnerproblematik, der 2. Ordner (Logfiles_Kopie) wird immer noch gelöscht!

Code: Select all

#NoTrayIcon ; Das AHK Symbol wird nicht angezeigt
#NoEnv ; Nicht nachsehen, ob leere Variablen evtl. Umgebungsvariablen sind, beschleunigt die Laufzeit
#SingleInstance force ; Bei Neustart des Scriptes die alte Instanz ohne Nachfrage ersetzen
SetWorkingDir %A_ScriptDir% ; Dateioperationen finden im Scriptverzeichnis statt, falls kein Pfad angegeben wird!
#Warn

; The most important switches in this command are the /XD which allows you to exclude folders, and /XF that you can use to exclude files. The other options are optional, but you should use these options that you should use in any standard copy process using Robocopy.


; --------------------------------------------------------------------------------------------------------------------
; Datenerstellung - LogFile - Zeitstempel
FormatTime, Datenerstellung_A, , 'Backup-A'---yyyy--MM--dd---HH-mm-ss'.log' ; Aufruf des Pfades mit "%Datenerstellung_A%"
FormatTime, Datenerstellung_B, , 'Backup-B'---yyyy--MM--dd---HH-mm-ss'.log' ; Aufruf des Pfades mit "%Datenerstellung_B%"
; --------------------------------------------------------------------------------------------------------------------

; --------------------------------------------------------------------------------------------------------------------
Quelle_001 := "C:\Users\" A_UserName "\Scoutsystems" 
Ziel_A := "D:\test"
Ziel_B := "D:\test"
Logfiles := "D:\test\001--Logfiles\"
Logfiles_Kopie := "D:\test\002--Logfiles_A_oder_B\"
; --------------------------------------------------------------------------------------------------------------------

; --------------------------------------------------------------------------------------------------------------------
Kopierbefehl_A = %A_WinDir%\System32\Robocopy.exe "%Quelle_001%" "%Ziel_A%" /E /PURGE /MIR /MT:2 /R:5 /W:10 /XF *.log /XD "%Logfiles%" "%Logfiles_Kopie%" /UNICODE /UNILOG:"%Logfiles%%Datenerstellung_A%"
; --------------------------------------------------------------------------------------------------------------------
Kopierbefehl_B = %A_WinDir%\System32\Robocopy.exe "%Quelle_001%" "%Ziel_B%" /E /PURGE /MIR /MT:2 /R:5 /W:10 /XF *.log /XD "%Logfiles%" "%Logfiles_Kopie%" /UNICODE /UNILOG:"%Logfiles%%Datenerstellung_B%"
; --------------------------------------------------------------------------------------------------------------------

runwait, %comspec% /c %Kopierbefehl_A%, , Hide

; runwait, %comspec% /c %Kopierbefehl_B%, , Hide

; MsgBox, 262144, = Immer im Vordergrund (WS_EX_TOPMOST-Style) (Wie System Modal, aber ohne Icon in der Titelleiste) 
MsgBox, 262144, >> Spiegelung erfolgreich, ###########################################`n###########################################`n`n`nDer Faktura Kopiervorgang ist abgeschlossen!`n`n`n###########################################`n###########################################


ExitApp
Greetings Best-Code-in-Use
Best-Code-in-Use
Posts: 184
Joined: 01 Dec 2015, 05:13
Location: Germany

Re: Backup Skript - Fragen....

15 Mar 2022, 05:57

@just me

Ups, Sorry, ich hatte Deinen Post nicht gesehen=

Code: Select all

Logfiles := "D:\test\001--Logfiles\"
Logfiles_Kopie := "D:\test\002--Logfiles_A_oder_B\"
Greetings Best-Code-in-Use
just me
Posts: 9423
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Backup Skript - Fragen....

15 Mar 2022, 06:10

Nach der von Dir zitierten Beschreibung denke ich, dass sich die unter /XF bzw. /XD gelisteten Dateien/Ordner im Quellverzeichnis befinden sollten.
Best-Code-in-Use
Posts: 184
Joined: 01 Dec 2015, 05:13
Location: Germany

Re: Backup Skript - Fragen....

15 Mar 2022, 06:28

Nein, in dem Fall sollen die Logs in das Zielverzeichnis.
Es geht darum dass man sich ansehen kann, von wann der aktuelle Sicherungsstand ist. :dance:
Im Fall der Fälle...

Prinzipiell funktioniert es ja auch, allerdings wird eben der 2. Ordner wegrasiert...
Greetings Best-Code-in-Use
BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

Re: Backup Skript - Fragen....

15 Mar 2022, 06:50

@Best-Code-in-Use - ich habe in einem solchen Fall die backup-folder entsprechend "datum"isiert benamt und mit einer (auf anderen PC's nicht angezeigten) system-dateiendung versehen. Die waren damit sortiert, und es fällt (dem Berechtigten) sofort auf wenn in der Reihe eine "Lücke" klafft. ;)
Best-Code-in-Use
Posts: 184
Joined: 01 Dec 2015, 05:13
Location: Germany

Re: Backup Skript - Fragen....

15 Mar 2022, 07:00

@Bobo

es geht ja hier nur darum, das man sehen kann, welche Sicherungen wann erfolgt sind.
Das Logfile kann dann auch per Mail verschickt werden, daher 2 Ordner, danach wird es in den 2. Ordner verschoben.
Es läuft ja noch täglich ein "echtes" Backup des Systems und aller Verzeichnisse, dieses wird, bei den Meisten, auf D:/ abgelegt.
Und von dort dann halt auf externe Laufwerke gespiegelt, die wöchentlich getauscht werden.
Dadurch würde, schlimmstenfalls, die Arbeit von einer Woche flöten gehen.
(Verschlüsselung durch Erpresserviren, etc.)
Greetings Best-Code-in-Use
Best-Code-in-Use
Posts: 184
Joined: 01 Dec 2015, 05:13
Location: Germany

So - Backup-Skript optimiert...

16 Mar 2022, 03:05

Für Alle die es gebrauchen können, hier nun das gesamte Batch Skript zum Kopieren der Festplatte (NICHT= C:\) auf eine Sicherungsplatte.
Der Trick von Laufwerksbuchstabe A und B ist das diese vom System nicht mehr vergeben werden.
Daher können diese bei der Formatierung / Einrichtung der Sicherungsplatten genutzt werden und es kommt nicht zum Konflikt mit anderen USB-Geräten!
Mein besonderer Dank geht an just me ohne dessen geduldige Hilfe es so nicht möglich gewesen wäre!

@BoBo
Ja, ich habe Deine Überlegung zum Logfile hier ebenfalls mit eingearbeitet.
Vielen Dank für die Anregung.

Code: Select all

#NoTrayIcon ; Das AHK Symbol wird nicht angezeigt
#NoEnv ; Nicht nachsehen, ob leere Variablen evtl. Umgebungsvariablen sind, beschleunigt die Laufzeit
#SingleInstance force ; Bei Neustart des Scriptes die alte Instanz ohne Nachfrage ersetzen
SetWorkingDir %A_ScriptDir% ; Dateioperationen finden im Scriptverzeichnis statt, falls kein Pfad angegeben wird!
; #Warn

; Mit dem Schalter /XD koennen Ordner ausgeschlossen werden
; Mit dem Schalter /XF koennen Dateien ausgeschlossen werden
; /XD Verzeichnissausschluesse duerfen keinen Backslash am Schluss haben=
; Korrekt= /XD "\System Volume Information" --- FALSCH= /XD "\System Volume Information\"

; --------------------------------------------------------------------------------------------------------------------
; Datenerstellung - LogFile - Zeitstempel
; FormatTime, Datenerstellung_A, , 'Backup-A'---yyyy--MM--dd---HH-mm-ss'.log' ; Aufruf des Pfades mit "%Datenerstellung_A%"
FormatTime, Datenerstellung_A, , yyyy--MM--dd---HH-mm-ss---'Backup-A.log' ; Aufruf des Pfades mit "%Datenerstellung_A%"
FormatTime, Datenerstellung_B, , yyyy--MM--dd---HH-mm-ss---'Backup-B.log' ; Aufruf des Pfades mit "%Datenerstellung_B%"
; --------------------------------------------------------------------------------------------------------------------
Quelle_001 := "D:\" 
Ziel_A := "A:\"
Ziel_B := "B:\"
; ---------------------------------
Logfiles := "D:\Z-001--Logfiles"
Logfiles_Kopie := "D:\Z-002--Logfiles_A_oder_B"
; ---------------------------------
NoCopy_001 := "\System Volume Information"
NoCopy_002 := "\$RECYCLE.BIN"
; ---------------------------------
LogVZ_A1 := "A:\Z-001--Logfiles"
LogVZ_A2 := "A:\Z-002--Logfiles_A_oder_B"
; ---------------------------------
LogVZ_B1 := "B:\Z-001--Logfiles"
LogVZ_B2 := "B:\Z-002--Logfiles_A_oder_B"
; ---------------------------------
Pruefdatei_A := "A:\"
Pruefdatei_B := "B:\"
; ---------------------------------
RemoveDrive := "RemoveDrive64.exe"
; ---------------------------------
Kopierbefehl_A = %A_WinDir%\System32\Robocopy.exe "%Quelle_001%" "%Ziel_A%" /E /PURGE /MIR /MT:2 /R:5 /W:10 /XF *.log /XD "%NoCopy_001%" "%NoCopy_002%" "%Logfiles%" "%Logfiles_Kopie%" "%LogVZ_A1%" "%LogVZ_A2%" "%LogVZ_B1%" "%LogVZ_B2%" /UNICODE /UNILOG:"%Logfiles%\%Datenerstellung_A%"
; ---------------------------------
Kopierbefehl_B = %A_WinDir%\System32\Robocopy.exe "%Quelle_001%" "%Ziel_B%" /E /PURGE /MIR /MT:2 /R:5 /W:10 /XF *.log /XD "%NoCopy_001%" "%NoCopy_002%" "%Logfiles%" "%Logfiles_Kopie%" "%LogVZ_A1%" "%LogVZ_A2%" "%LogVZ_B1%" "%LogVZ_B2%" /UNICODE /UNILOG:"%Logfiles%\%Datenerstellung_B%"
; --------------------------------------------------------------------------------------------------------------------


loop   ; Schleife prueft welches Laufwerk vorhanden ist
{

   If FileExist(Pruefdatei_A)
      {
	runwait, %comspec% /c %Kopierbefehl_A%, , Hide
	FileCopy, %Logfiles%\*.log, %LogVZ_A1%\*.log ; Die Logdateien werden kopiert auf das Backup-Laufwerk
	RunWait, %RemoveDrive%  a: -d -e -l ,,hide  - Das Auswerfen des Laufwerkes ist nicht immer sinnvoll!!!
	Break ; <<<<< Fertig, die Schleife kann verlassen werden.
	  }
   Else If FileExist(Pruefdatei_B)  ; sonst wenn das Laufwerk B angeschlossen ist
      {
	runwait, %comspec% /c %Kopierbefehl_B%, , Hide
	FileCopy, %Logfiles%\*.log, %LogVZ_B1%\*.log ; Die Logdateien werden kopiert auf das Backup-Laufwerk
	RunWait, %RemoveDrive%  b: -d -e -l ,,hide  - Das Auswerfen des Laufwerkes ist nicht immer sinnvoll!!!
	Break ; <<<<< Fertig, die Schleife kann verlassen werden.
	  }
	Else  ; falls kein externes Laufwerk angeschlossen ist
      {
		MsgBox, 4, Externes Laufwerk A oder B nicht gefunden!!, ###################################################`n###################################################`n`n`nDas externe Laufwerk A oder B wurde nicht gefunden.`nBitte eine externe Sicherungs-Festplatte anschließen!!!`n`nNach dem Anschließen JA drücken.`n`nFortfahren???`n(Drücken Sie JA oder NEIN)`n`n`n###################################################`n###################################################
		IfMsgBox No
			{
			ExitApp ; es wurde "Nein" gedrueckt, also beende das Script
			}
		; Bei JA springt das Script automatisch zum Anfang der Schleife (Loop)
		}
} ; Ende der Laufwerkspruefung und Spiegelung (per Loop)


FileMove, %Logfiles%\*.log, %Logfiles_Kopie%\*.log  ; Verschiebt die Datei, ohne sie umzubenennen

; MsgBox, 262144, = Immer im Vordergrund ohne Icon in der Titelleiste!
MsgBox, 262144, >> Spiegelung erfolgreich, ###########################################`n###########################################`n`n`nDer Kopiervorgang ist abgeschlossen!`n`n`n###########################################`n###########################################


ExitApp


Greetings Best-Code-in-Use

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: gero and 14 guests