Profile Restore Script

Here is the script that will take the files backed up, via my Profile Copy Script, and restore them to where they belong.

This was written with AutoIt V3, most of the code belongs to ezzetabi

The script will work on XP, Vista or Win7.

Compile and execute with one command line parameter: the source (should be the same argument given to the Profile Copy Script).

Will copy files from a local folder or network share.

Copies files to the currently logged in user’s My Documents, Favourites, Desktop and will place the NK2 file(s) in the folder it belongs in (I believe Outlook needs to be installed before this script is run, for the NK2 file(s) to be returned correctly – Sorry, I didn’t have a computer without Outlook to test on).

#cs —————————————————————————-

AutoIt Version: 3.3.0.0
Author: Clint McGuire
Script Function:
Restore User Profile for Windows.

#ce —————————————————————————-

; Script Start – Add your code below here

; Usage: Parameter1 = Source;

Global $Source = $CmdLine[1]

_CopyDirWithProgress($Source & “” & @UserName & “Desktop”, @DesktopDir)

_CopyDirWithProgress($Source & “” & @UserName & “MyDocs”, @MyDocumentsDir)

_CopyDirWithProgress($Source & “” & @UserName & “Favourites”, @FavoritesDir)

FileCopy($Source & “” & @UserName & “*.NK2″, @UserProfileDir & “application datamicrosoftoutlook*.*”)

Func _CopyDirWithProgress($sOriginalDir, $sDestDir)

;Writen by ezzetabi http://www.autoitscript.com/forum/index.php?showuser=839

;$sOriginalDir and $sDestDir are quite selfexplanatory…

;This func returns:

; -1 in case of critical error, bad original or destination dir

; 0 if everything went all right

; >0 is the number of file not copied and it makes a log file

; if in the log appear as error message ’0 file copied’ it is a bug of some windows’ copy command that does not redirect output…

If StringRight($sOriginalDir, 1) <> ” Then $sOriginalDir = $sOriginalDir & ”

If StringRight($sDestDir, 1) <> ” Then $sDestDir = $sDestDir & ”

If $sOriginalDir = $sDestDir Then Return -1

ProgressOn(‘Copying…’, ‘Making list of files…’ & @LF & @LF, ”, -1, -1, 18)

Local $aFileList = _FileSearch($sOriginalDir)

If $aFileList[0] = 0 Then

ProgressOff()

SetError(1)

Return -1

EndIf

If FileExists($sDestDir) Then

If Not StringInStr(FileGetAttrib($sDestDir), ‘d’) Then

ProgressOff()

SetError(2)

Return -1

EndIf

Else

DirCreate($sDestDir)

If Not FileExists($sDestDir) Then

ProgressOff()

SetError(2)

Return -1

EndIf

EndIf

Local $iDirSize, $iCopiedSize = 0, $fProgress = 0

Local $c, $FileName, $iOutPut = 0, $sLost = ”, $sError

Local $Sl = StringLen($sOriginalDir)

_Quick_Sort($aFileList, 1, $aFileList[0])

$iDirSize = Int(DirGetSize($sOriginalDir) / 1024)

ProgressSet(Int($fProgress * 100), $aFileList[$c], ‘Coping file:’)

For $c = 1 To $aFileList[0]

$FileName = StringTrimLeft($aFileList[$c], $Sl)

ProgressSet(Int($fProgress * 100), $aFileList[$c] & ‘ -> ‘& $sDestDir & $FileName & @LF & ‘Total KiB: ‘ & $iDirSize & @LF & ‘Done KiB: ‘ & $iCopiedSize, ‘Coping file: ‘ & Round($fProgress * 100, 2) & ‘ % ‘ & $c & ‘/’ &$aFileList[0])

If StringInStr(FileGetAttrib($aFileList[$c]), ‘d’) Then

DirCreate($sDestDir & $FileName)

Else

If Not FileCopy($aFileList[$c], $sDestDir & $FileName, 1) Then

If Not FileCopy($aFileList[$c], $sDestDir & $FileName, 1) Then;Tries a second time

If RunWait(@ComSpec & ‘ /c copy /y “‘ & $aFileList[$c] & ‘” “‘ & $sDestDir & $FileName & ‘”>’ & @TempDir & ‘o.tmp’, ”, @SW_HIDE)=1 Then;and a third time, but this time it takes the error message

$sError = FileReadLine(@TempDir & ‘o.tmp’,1)

$iOutPut = $iOutPut + 1

$sLost = $sLost & $aFileList[$c] & ‘ ‘ & $sError & @CRLF

EndIf

FileDelete(@TempDir & ‘o.tmp’)

EndIf

EndIf

FileSetAttrib($sDestDir & $FileName, “+A-RSH”);<- Comment this line if you do not want attribs reset.

$iCopiedSize = $iCopiedSize + Int(FileGetSize($aFileList[$c]) / 1024)

$fProgress = $iCopiedSize / $iDirSize

EndIf

Next

ProgressOff()

If $sLost <> ” Then;tries to write the log somewhere.

If FileWrite($sDestDir & ‘notcopied.txt’,$sLost) = 0 Then

If FileWrite($sOriginalDir & ‘notcopied.txt’,$sLost) = 0 Then

FileWrite(@WorkingDir & ‘notcopied.txt’,$sLost)

EndIf

EndIf

EndIf

Return $iOutPut

EndFunc ;==>_CopyDirWithProgress

Func _FileSearch($sIstr, $bSF = 1)

; $bSF = 1 means looking in subfolders

; $sSF = 0 means looking only in the current folder.

; An array is returned with the full path of all files found. The pos [0] keeps the number of elements.

Local $sCriteria, $sBuffer, $iH, $iH2, $sCS, $sCF, $sCF2, $sCP, $sFP, $sOutPut = ”, $aNull[1]

$sCP = StringLeft($sIstr, StringInStr($sIstr, ”, 0, -1))

If $sCP = ” Then $sCP = @WorkingDir & ”

$sCriteria = StringTrimLeft($sIstr, StringInStr($sIstr, ”, 0, -1))

If $sCriteria = ” Then $sCriteria = ‘*.*’

;To begin we seek in the starting path.

$sCS = FileFindFirstFile($sCP & $sCriteria)

If $sCS <> – 1 Then

Do

$sCF = FileFindNextFile($sCS)

If @error Then

FileClose($sCS)

ExitLoop

EndIf

If $sCF = ‘.’ Or $sCF = ‘..’ Then ContinueLoop

$sOutPut = $sOutPut & $sCP & $sCF & @LF

Until 0

EndIf

;And after, if needed, in the rest of the folders.

If $bSF = 1 Then

$sBuffer = @CR & $sCP & ‘*’ & @LF;The buffer is set for keeping the given path plus a *.

Do

$sCS = StringTrimLeft(StringLeft($sBuffer, StringInStr($sBuffer, @LF, 0, 1) – 1), 1);current search.

$sCP = StringLeft($sCS, StringInStr($sCS, ”, 0, -1));Current search path.

$iH = FileFindFirstFile($sCS)

If $iH <> – 1 Then

Do

$sCF = FileFindNextFile($iH)

If @error Then

FileClose($iH)

ExitLoop

EndIf

If $sCF = ‘.’ Or $sCF = ‘..’ Then ContinueLoop

If StringInStr(FileGetAttrib($sCP & $sCF), ‘d’) Then

$sBuffer = @CR & $sCP & $sCF & ‘*’ & @LF & $sBuffer;Every folder found is added in the begin of buffer

$sFP = $sCP & $sCF & ”; for future searches

$iH2 = FileFindFirstFile($sFP & $sCriteria); and checked with the criteria.

If $iH2 <> – 1 Then

Do

$sCF2 = FileFindNextFile($iH2)

If @error Then

FileClose($iH2)

ExitLoop

EndIf

If $sCF2 = ‘.’ Or $sCF2 = ‘..’ Then ContinueLoop

$sOutPut = $sOutPut & $sFP & $sCF2 & @LF;Found items are put in the Output.

Until 0

EndIf

EndIf

Until 0

EndIf

$sBuffer = StringReplace($sBuffer, @CR & $sCS & @LF, ”)

Until $sBuffer = ”

EndIf

If $sOutPut = ” Then

$aNull[0] = 0

Return $aNull

Else

Return StringSplit(StringTrimRight($sOutPut, 1), @LF)

EndIf

EndFunc ;==>_FileSearch

Func _Quick_Sort(ByRef $SortArray, $First, $Last);Larry’s code

Dim $Low, $High

Dim $Temp, $List_Separator

$Low = $First

$High = $Last

$List_Separator = StringLen($SortArray[ ($First + $Last) / 2])

Do

While (StringLen($SortArray[$Low]) < $List_Separator)

$Low = $Low + 1

WEnd

While (StringLen($SortArray[$High]) > $List_Separator)

$High = $High – 1

WEnd

If ($Low <= $High) Then

$Temp = $SortArray[$Low]

$SortArray[$Low] = $SortArray[$High]

$SortArray[$High] = $Temp

$Low = $Low + 1

$High = $High – 1

EndIf

Until $Low > $High

If ($First < $High) Then _Quick_Sort($SortArray, $First, $High)

If ($Low < $Last) Then _Quick_Sort($SortArray, $Low, $Last)

EndFunc ;==>_Quick_Sort

MsgBox(0, “ProfileCopy”, “Backup Complete!”)

2 comments to Profile Restore Script

Leave a Reply

  

  

  

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>