Solved

How would i do a complete folder compare and copy difference in autoit

Posted on 2014-01-03
7
967 Views
Last Modified: 2014-01-06
I have a folder out on a networkshare lets call it c
i want to copy all of its contents over to a computer i'm settings up and ONLY copy files to the computer that are not there or different on the networkshare.

so lets say i have c:\backup.bat  on the networkshare
i want it to be the exact same on the new computer.

the exact same structure and and subdirectory structure should apply

i have something like this already in vb but it doesn't check for existance or differences.

'Copy Folder Structure
        bkwrk.ReportProgress(0, "0|0|Getting Folder Structure (mis/" & sMachine & ")...")
        iMaxCnt = My.Computer.FileSystem.GetDirectories("\\mis\mis3\machines\" & sMachine & "\c\", FileIO.SearchOption.SearchAllSubDirectories, "*.*").Count
        For Each strFolders In My.Computer.FileSystem.GetDirectories("\\mis\mis3\machines\" & sMachine & "\c\", FileIO.SearchOption.SearchAllSubDirectories, "*.*")
            iCurCnt = iCurCnt + 1
            sDestination = "C:\" & Mid(strFolders, InStr(strFolders, "\C\") + 3, strFolders.Length - InStr(strFolders, "\C\"))
            bkwrk.ReportProgress(iCurCnt / iMaxCnt * 100, iCurCnt & "|" & iMaxCnt & "|Creating Folder: " & sDestination) 'Strings.Left(strFolders, 10) & "..." & Strings.Right(strFolders, 15))
            My.Computer.FileSystem.CopyDirectory(strFolders, sDestination, True)
        Next
        'Copy Program Files
        bkwrk.ReportProgress(0, "0|0|Getting Files (mis/" & sMachine & ")...")
        iCurCnt = 0
        iMaxCnt = My.Computer.FileSystem.GetFiles("\\mis\mis3\machines\" & sMachine & "\c\", FileIO.SearchOption.SearchAllSubDirectories, "*.*").Count
        For Each StrFiles In My.Computer.FileSystem.GetFiles("\\mis\mis3\twmachines\" & sMachine & "\c\", FileIO.SearchOption.SearchAllSubDirectories, "*.*")
            iCurCnt = iCurCnt + 1
            sDestination = "C:\" & Mid(StrFiles, InStr(StrFiles, "\C\") + 3, StrFiles.Length - InStr(StrFiles, "\C\"))
            bkwrk.ReportProgress(iCurCnt / iMaxCnt * 100, iCurCnt & "|" & iMaxCnt & "|Copying File: " & sDestination) 'Strings.Left(StrFiles, 10) & "..." & Strings.Right(StrFiles, 15))
            My.Computer.FileSystem.CopyFile(StrFiles, sDestination, True)
        Next

Open in new window

0
Comment
Question by:bbimis
  • 3
  • 2
  • 2
7 Comments
 
LVL 19

Expert Comment

by:strivoli
Comment Utility
Why not using RoboCopy instead?
0
 
LVL 29

Expert Comment

by:matrixnz
Comment Utility
If you have the latest version of AutoIT use the _FileListToArrayRec function (see AutoIT Help File for more info), I've used this quite extensively in the past.  Here is an example of the code (note not tested).

#include <file.au3>
;~ Get System Drive Letter for %SystemDrive% Enviroment Variable of local machine
$_DIR_SYSDRIVE = EnvGet('SystemDrive')
;~ Get Server Share Name to copy contents from
$_DIR_NETDRIVE = '\\mis\mis3\machines\' & @ComputerName & '\c'

;~ Create an Array (files/folders), including subdirectories, use relative path name i.e. Folder\Filename.exe
$_ARR_SYSDRIVE = _FileListToArrayRec($_DIR_NETDRIVE, '*', 0, 1, 0, 1)
;~ Create an Array (files/folders), including subdirectories, use full path name i.e. \\mis\mis3\machines\ComputerName\c\Folder\Filename.exe
	;~ Exit if no array is created from the shared network
	If @error = 1 Then Exit
$_ARR_NETDRIVE = _FileListToArrayRec($_DIR_NETDRIVE, '*', 0, 1, 0, 2)
	;~ Exit if no array is created from the shared network
	If @error = 1 Then Exit

;~ Go through the full folder list and check that it doesn't exist on the local machine if not found copy the file and create the directory if necessary.
For $x = 1 To $_ARR_NETDRIVE[0]
	If StringInStr($_ARR_NETDRIVE[$x], $_ARR_SYSDRIVE[$x]) And FileExists($_DIR_SYSDRIVE & '\' & $_ARR_SYSDRIVE[$x]) = 0 Then
		FileCopy($_ARR_NETDRIVE[$x], $_DIR_SYSDRIVE & '\' & $_ARR_SYSDRIVE[$x], 8)
	EndIf
Next

Open in new window

0
 

Author Comment

by:bbimis
Comment Utility
matrixnz,
that makes sense and all but how would i check to see if it is new. not so much of exist thats a given.
I was thinking something like this maybe ?
RunWait(@ComSpec & " /c " & 'xcopy "' & '\\fileserv\e\apps\c\' & '" "' & 'c:\' & '" /D /E /C /R

Open in new window

0
Better Security Awareness With Threat Intelligence

See how one of the leading financial services organizations uses Recorded Future as part of a holistic threat intelligence program to promote security awareness and proactively and efficiently identify threats.

 
LVL 19

Assisted Solution

by:strivoli
strivoli earned 50 total points
Comment Utility
Please consider RoboCopy.
0
 

Author Comment

by:bbimis
Comment Utility
stivoli,
i was looking at robocopy but i don't really understand how to make it check path1 against path2 and copy accordingly.

What my goal is to take and copy all the files on the share \\share\c to the root of the local machine
and only copy files that do not exist or are different on the \\share\c

thanks!
0
 
LVL 29

Accepted Solution

by:
matrixnz earned 450 total points
Comment Utility
Probably something like the following, please note I modified the original to only use one array, which makes it more robust.  Hope it makes sense.
#include <file.au3>
;~ Get System Drive Letter for %SystemDrive% Enviroment Variable of local machine
$_DIR_SYSDRIVE = EnvGet('SystemDrive')
;~ Get Server Share Name to copy contents from
$_DIR_NETDRIVE = '\\mis\mis3\machines\' & @ComputerName & '\c'

;~ Create an Array (files/folders), including subdirectories, use relative path name i.e. Folder\Filename.exe
$_ARR_NETDRIVE = _FileListToArrayRec($_DIR_NETDRIVE, '*', 0, 1, 0, 1)
	;~ Exit if no array is created from the shared network
	If @error = 1 Then Exit

;~ Go through the full folder list and check that it doesn't exist on the local machine if not found copy the file and create the directory if necessary.
For $x = 1 To $_ARR_NETDRIVE[0]
	;~ If File does not exist then copy the file and create directory if required
	If FileExists($_DIR_SYSDRIVE & '\' & $_ARR_NETDRIVE[$x]) = 0 Then
		FileCopy($_DIR_NETDRIVE & '\' & $_ARR_NETDRIVE[$x], $_DIR_SYSDRIVE & '\' & $_ARR_SYSDRIVE[$x], 8)
	Else
		;~ The File Exists so compare the time stamp of Network file against local file and if greater, copy the file overwriting the existing file.
		If FileGetTime($_DIR_NETDRIVE & '\' & $_ARR_NETDRIVE[$x], 0, 1) > FileGetTime($_DIR_SYSDRIVE & '\' & $_ARR_NETDRIVE[$x]) Then
			FileCopy($_DIR_NETDRIVE & '\' & $_ARR_NETDRIVE[$x], $_DIR_SYSDRIVE & '\' & $_ARR_SYSDRIVE[$x], 9)
		EndIf
	EndIf
Next

Open in new window

0
 

Author Closing Comment

by:bbimis
Comment Utility
i gave points to matrixnz because his is what i was seeking. i gave 50 for the effort to the other member. Thanks!
0

Featured Post

How to improve team productivity

Quip adds documents, spreadsheets, and tasklists to your Slack experience
- Elevate ideas to Quip docs
- Share Quip docs in Slack
- Get notified of changes to your docs
- Available on iOS/Android/Desktop/Web
- Online/Offline

Join & Write a Comment

Suggested Solutions

Title # Comments Views Activity
Using Pop Up Calculator in Excel 4 41
Show hidden user account 7 25
Groovy:unable to resolve class error 2 27
Path to Python 9 35
Displaying an arrayList in a listView using the default adapter is rarely the best solution. To get full control of your display data, and to be able to refresh it after editing, requires the use of a custom adapter.
If you’re thinking to yourself “That description sounds a lot like two people doing the work that one could accomplish,” you’re not alone.
Learn the basics of strings in Python: declaration, operations, indices, and slicing. Strings are declared with quotations; for example: s = "string": Strings are immutable.: Strings may be concatenated or multiplied using the addition and multiplic…
Learn the basics of if, else, and elif statements in Python 2.7. Use "if" statements to test a specified condition.: The structure of an if statement is as follows: (CODE) Use "else" statements to allow the execution of an alternative, if the …

762 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

10 Experts available now in Live!

Get 1:1 Help Now