Jump to content

Directory Copy with Progress - Need Help


SimonMag
 Share

Recommended Posts

Hi,

I have a problem with a script, I have used some code from an example script that copies a directory with a progress bar, this worked great with my previous version of AutoIT, but now I have upgraded to the newer version and made some changes to the script and compiled I receive the following error:

ERROR: $sIstr already declared as parameter

If anyone could shed some light in the right direction.....

Thanks.

CODE
#include <GUIConstants.au3>

#Include <File.au3>

Opt("GUIOnEventMode", 1)

Opt("TrayIconHide", 1)

GUICreate("DirCopy", 330,200,-1,-1, $WS_OVERLAPPEDWINDOW)

SplashTextOn("Please Wait", "Creating Directories and Copying Files....", 400, 50, -1, -1, 0,"", 12)

Sleep(1000)

SplashOff()

_CopyDirWithProgress("\\fs_xxx\VOL1\Applications\ZfdUpTest\", "C:\ZDM65\")

Func _CopyDirWithProgress($sOriginalDir, $sDestDir)

;$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 Files...', '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 $sIstr, $bSF, $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

SplashTextOn("Please Wait", "Installing Novell Client....", 250, 30, -1, -1, 32,"", 12)

RunWait("C:\ZDM65\NovCli\setupnw.exe /acu /u:C:\ZDM65\NovCli\admin\acu.txt", "C:\ZDM65", @SW_MAXIMIZE)

SplashOff()

SplashTextOn("Please Wait", "Installing ZenWorks Agent....", 250, 30, -1, -1, 32,"", 12)

RunWait(@SystemDir & "\msiexec.exe /i C:\ZDM65\ZfdAgent.msi ADDLOCAL=WorkstationManager,RemoteManagement,ApplicationLauncher,Imaging,MirrorDriver ALLUSERS=1 STARTUP_APPEXPLORE=0 REBOOT=ReallySuppress /passive","C:\ZDM65")

SplashOff()

SplashTextOn("Please Wait", "Installing Registry Settings....", 400, 50, -1, -1, 0,"", 12)

; Reset client welcome bitmap

RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\Novell\NWGINA\Welcome Screen", "Bitmap", "REG_SZ", "NWWELCOME.BMP")

; Remove SecEdit settings in base build

RegDelete("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SeCEdit\Reg Values\MACHINE/Software/Microsoft/Windows/CurrentVersion/Policies/System/LegalNoticeCaption")

RegDelete("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\SeCEdit\Reg Values\MACHINE/Software/Microsoft/Windows/CurrentVersion/Policies/System/LegalNoticeText")

; Remove old legal notice text

RegDelete("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Winlogon" , "legalnoticecaption")

RegDelete("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Winlogon" , "legalnoticetext")

RegDelete("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\system" , "legalnoticecaption")

RegDelete("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\system" , "legalnoticetext")

; Force users to hit C-A-D to login and accept legal notice

RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" , "DisableCAD" , "REG_DWORD" , "00000000")

RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" , "dontdisplaylastusername" , "REG_DWORD" , "00000001")

RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" , "legalnoticecaption" , "REG_SZ" , "Important Notice")

RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" , "legalnoticetext" , "REG_SZ" , "Do not login unless you are an authorised user. In doing so you agree to abide by ICT Policies as detailed in the document 'Best Practice Policy for the provision and use of ICT' which is available on the IT Services section of the Intranet or from the IT Service Desk.")

RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" , "CompatibleRUPSecurity" , "REG_DWORD" , "00000001")

RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" , "passwordexpirywarning" , "REG_DWORD" , "00000000")

; Synchronise NDS Username with Windows Username

RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\Novell\Login\TAB SETTINGS\NT Credentials" , "Sync NDS Username" , "REG_DWORD" , "00000001")

; Don't display last user name

RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\Novell\Location Profiles\Services\{1E6CEEA1-FB73-11CF-BD76-00001B27DA23}\Default" , "Save On Exit" , "REG_DWORD" , "00000000")

; Show Hidden Files

RegWrite("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" , "Hidden", "REG_DWORD" , "00000001")

; Taskbar - Disable Personalised Menus

RegWrite("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" , "IntelliMenus" , "REG_SZ" , "NO")

; Taskbar - Expand Printers

RegWrite("HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced" , "CascadePrinters" , "REG_SZ" , "YES")

; Change Windows Source Path to Network

RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion" , "SourcePath" , "REG_SZ" , "\\\\FS_xxx\\VOL1\\Winxp\\i386")

; Set AWI server

RegWrite("HKEY_LOCAL_MACHINE\Software\Novell\ZENworks\ZENWSREG" , "ImportServer" , "REG_SZ" , "1x.1x.1x.6x")

;Show Drive letters first in Explorer

RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer" , "ShowDriveLettersFirst" , "REG_DWORD" , "00000004")

;Change My Computer to "user" on "PC"

RegWrite("HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}" , "LocalizedString" , "REG_EXPAND_SZ" , "%USERNAME% on %COMPUTERNAME%")

;Clear Temporary Internet Files on exit of IE

RegWrite("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Cache" , "Persistent" , "REG_DWORD" , "00000000")

RegWrite("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\Cache" , "Persistent" , "REG_DWORD" , "00000000")

;Set Desktop Wallpaper to remain as default

RegWrite("HKEY_USERS\.DEFAULT\Control Panel\Desktop" , "Wallpaper" , "REG_SZ" , "%WINDIR%\\SYSTEM32\\xxxx.bmp")

;Display the full path in both places

RegWrite("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\CabinetState" , "Settings" , "REG_BINARY" , "0c,00,02,00,1b,01,e7,77,60,00,00,00")

RegWrite("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\CabinetState" , "FullPath" , "REG_DWORD" , "00000001")

RegWrite("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\CabinetState" , "FullPathAddress" , "REG_DWORD" , "00000001")

;Disable Messenger Service

RegWrite("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Messenger" , "Start" , "REG_DWORD" , "00000004")

;Force Explorer to Explore and not Open

RegWrite("HKEY_CLASSES_ROOT\Folder\shell" , "" , "REG_SZ" , "explore")

;Disable "Welcome to Windows" message

RegWrite("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Tips" , "Show" , "REG_DWORD" , "00000000")

;Remove Language bar

RegDelete("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run" , "internat.exe")

SplashOff()

Run('C:\ZDM65\zshutdwn.exe /action:reboot /force /caption:"Restarting, please wait..." /delay:5 /nocancel', "C:\ZDM65")

Edited by SimonMag
Link to comment
Share on other sites

you are using $sIstr as an argument for the function and redeclaring it, that would cause the argument to be reset, invalidating the function. just change the variable inside the function to something else.

Edited by Kerros

Kerros===============================================================How to learn scripting: Figure out enough to be dangerous, then ask for assistance.

Link to comment
Share on other sites

Line 95:

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 $sIstr, $bSF, $sCriteria, $sBuffer, $iH, $iH2, $sCS, $sCF, $sCF2, $sCP, $sFP, $sOutPut = '', $aNull[1]

; 

EndFunc

When you name the input variables in the Func declaration, you automatically declare them Local to that function. So you shouldn't re-declare $sIstr or $bSF inside the function. I believe declaring a variable over again destroys it's contents, so that would cost you your input value also.

:)

Valuater's AutoIt 1-2-3, Class... Is now in Session!For those who want somebody to write the script for them: RentACoder"Any technology distinguishable from magic is insufficiently advanced." -- Geek's corollary to Clarke's law
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...