just a little script I find useful. Always wanted to have an easy way to copy/mirror a complete folder with some kind of progressbar.
Since robocopy is reliable and pre-installed in windows 10, it's the easiest way to achieve a copy of a folder. But there is no gui, the plain dosbox looks ugly... so I came up with this.
It's a simple script, some would call it a stupid wrapper. The only interesting part of it is the ability to display progressbars for copied bytes and copied files.
The script launches robocopy two times: at the first run, robocopy gets called with the /L Parameter, so it just logs what it WOULD do. So the script gathers the number of files and bytes which have to be processed. After that, robocopy gets called to actually do the job and the logfile is read out and compared to the total amount of files/bytes.
Warning: there are two possible modes supported: copy and mirror. For gods and your own sake, if you don't know what "mirror" does, do not use this! Short Explanation: "mirror" will force the destination folder to be an exact copy of the source folder, so if there are files in the destination folder which are not in the source folder, robocopy will kill them without any warning!
Please pardon my noobiness. I am working on backup restore script where a progress bar is required. I have tried using following code which works fine with folders but not really with single file because robocopy
Func CopyFolder($srcDir, $destDir, $part) ;======> $part shows whats being copied (e.g. Desktop, Documents etc.) If StringRight($srcDir, 1) = "\" Then $srcDir = StringLeft($srcDir, StringLen($srcDir) - 1) If Not FileExists($destDir) Then DirCreate($destDir) $srcSize = DirGetSize($srcDir, $DIR_EXTENDED) $1_percent = $srcSize / 100 $cmd = 'C:\Windows\System32\robocopy.exe "' & $srcDir & '" "' & $destDir & '" /E /Z /XO /XX /FFT /XJ /NDL /NJH /FP /ETA /NP /V /R:10 /W:5 /LOG+:"' & $logFile & '" /XF desktop.ini thumbs.db' Run(@ComSpec & " /c " & $cmd, "", @SW_HIDE) Do Sleep(300) Until ProcessExists("robocopy.exe") ProgressOn($part, $1_percent & "%", "", 0, 0, 16) Do $destSize = DirGetSize($destDir, $DIR_EXTENDED) ProgressSet(Round($destSize / $1_percent, 2), Round($destSize / (1024 * 1024), 2) & " MB of " & Round($srcSize / (1024 * 1024), 2) & " MB copied", Round($destSize / $1_percent, 2) & "%") Sleep(200) Until ProcessExists("robocopy.exe") = 0 ProgressOff() FileWriteLine($logFile, @CRLF & @CRLF) EndFunc ;==>CopyFolder Part of the problem is that I need to generate logs of files being copied. One particular problem is firefox profile directory. the directory is named as oi3jdslk.default or asdwdx.new and I need to copy places.sqlite from this directory.
Xcopy manages to copy FROM this directory but not TO this directory because of wildcards
Then I came across this neat script
Func CopyFile($fromFile, $todirectory) Local $FOF_RESPOND_YES = 16 Local $FOF_SIMPLEPROGRESS = 256 $winShell = ObjCreate("shell.application") $winShell.namespace($todirectory).CopyHere($fromFile, $FOF_RESPOND_YES) EndFunc ;==>CopyFile It helped me copy other single files but not the one required from firefox profile folder. Here is how I am trying to process that
$path = @UserProfileDir & "\AppData\Roaming\Mozilla\Firefox\" & $ffDir & "\places.sqlite" CopyFile($path, $BUFolder & "Mozilla") ;===> $BUFolder = "E:\" & @username & " - Backup\" #cs ====================================================== $ffDir is another variable derived from this function. This variable is the gets the default firefox profile to copy places.sqlite from $ffDir is returned as Profiles\xbsen2s.default (Firefox randomizes the profile directory for extra security(?). At least that's what they say. #ce ====================================================== Func FFProfile() Local $iniFile = @UserProfileDir & "\AppData\Roaming\Mozilla\Firefox\profiles.ini" Local $ddNumber Local $ddLine Local $Line If FileExists($iniFile) Then FileOpen($iniFile, 0) For $i = 1 To _FileCountLines($iniFile) $Line = FileReadLine($iniFile, $i) If StringInStr("DEFAULT=1", $Line) Then $ddNumber = $i - 1 ExitLoop ElseIf StringInStr("Name=default", $Line) Then $ddNumber = $i + 2 EndIf Next $ddLine = FileReadLine($iniFile, $ddNumber) $ffDir = StringReplace(StringTrimLeft($ddLine, 5), "/", "\") $ffInstall = 1 Else $ffInstall = 0 EndIf FileClose($iniFile) EndFunc ;==>FFProfile I really like how natural the progress bar from second copy script look like and would like to keep the progress bar uniform across the program. I am willing to learn if anyone can point me in right direction and help me achieve this.
Any help is highly appreciated!!
Hi I need your help
I need download backup from 200 remote pc. I calculate that I can download 20 backups in one time. I need to create loop, take localizations from txt file and start 20 downloads in one time (i want use ShellExecute and robocopy), after finish one from running 20 take another localizations from txt file until localizations finish. And I need trigger if is 7:00 pause script. I hope you know what I mean
Many thanks for help, sorry for my english.
This is what I got:
#include <MsgBoxConstants.au3> #include <WinAPIFiles.au3> #include <FileConstants.au3> #include <File.au3> #include <Array.au3> #include <Date.au3> Local $targets = @ScriptDir& "\targets.txt" Local $log_name = "\autoit.log" MsgBox($MB_SYSTEMMODAL, "", "start copy", 1) Example() Func Example() If Not FileExists($targets) Then MsgBox($MB_SYSTEMMODAL, "", "The file targets.txt - doesn't exist!") Exit EndIf FileOpen($targets, 0) Global $arr ReDim $arr[_FileCountLines($targets)+1] For $i = 1 to _FileCountLines($targets) $line = FileReadLine($targets, $i) $arr[$i] = $line ; Check if is online Local $iPing = Ping($arr[$i], 250) If $iPing Then ; ONLINE $rc = FileCopy("\\"&$arr[$i]&"\e$\backup\", @ScriptDir&"\downloads\"&$arr[$i]&"\", $FC_CREATEPATH) If $rc = 0 Then _FileWriteLog(@ScriptDir & $log_name, $arr[$i]&" ONLINE error") Else _FileWriteLog(@ScriptDir & $log_name, $arr[$i]&" ONLINE done") EndIf Else ;OFFLINE _FileWriteLog(@ScriptDir & $log_name, $arr[$i]&" OFFLINE") EndIf Next EndFunc ;==>Example MsgBox($MB_SYSTEMMODAL, "", "Finish downloads backups") Exit
TinyBackupBox : Do a Backup of folders you want to a local/external drive/directory by using Robocopy.
A Big Thank to Yashield for TVExplorer.au3 and WinApiEx.au3
Includes needed : >TVExplorer.au3 and >WinApiEx.au3
* Left Treeview :
Check all folders Checkboxes you want to backup.
Hold Shift key when clicking a first child Checkbox will check all other child Checkboxes.
A right click on a parent item will uncheck all his child Checkboxes.
* Right Treeview :
A left click for select Backup Directory.
A right click menu on an item for create a new sub-folder which you can give the name you want.
This new sub-folder will be created and added as child item of the item you have right clicked.
* Start Button :
A Click on Start Button will start backup normally.
Hold Shift key when clicking it will start backup on Idle Mode.
Idle Mode is used for start or resume backup after a period of user inactivity (that you can set by tray menu)
and will pause current backup if not idle.
* Stop Button :
A click on Stop Button will Pause backup, and any changes will affect the backup when resume it.
You can resume a current backup by Re-clicking Start Button.
Hold Shift key when clicking Stop Button will totally Cancel current backup.
In Idle mode Stop Button is inactive until you Hold Shift key and click for Cancel current backup.
* Refresh Button :
A Click will refresh both treeviews and set them to the previous selections you have done.
Hold Shift key when clicking it will refresh both treeview and set them to the root.
* Tray Menu :
By Default Robocopy copy only new files,
so i add the possibility to
_ delete previous existing dir.
_ delete destination files and dirs that no longer exists in source.
_ Preserve all Attributes.
_ Show Robocopy Console window.
_ Set Idle Time Delay.
_ Open Backup Dir.
Update of 2011-12-21
Previous downloads : 103
source and executable are available in the Download Section
minimalist but handy !
Hope you like it !
And do not forget to create backup periodically !
I'm currently writing a script that will execute some Robocopy batches among what has been ticked by the Technician.
The script is divided in two files (the main & the functions) but the thing is that I have to write multiple lines for all controls, as you can see in the functions file.
1- Is there a way to shorten this?
2- To avoid writing bunch of lines to check whether checkboxes are checked and to lunch appropriate bat, is there also a way to go quicker when clicking on the submit button? (will be implemented in the SubmitCopyChoice() Function)
Thanks guys for all the help you can offer