Jump to content

Progress Bar Revisited


Recommended Posts

I was sent to this code last week when I asked a question about copying files with a progress bar inside of AutoIT. The script works exactly as I want it to on its own, but I am having an issue with a RunAsSet command. If I remove the RunAsSet in the script that calls the progress bar executable it will work exactly as the original author intended, but nothing else in my script will work because of a lack of permissions. If I use the RunAsSet in my script everything works except for the Progress Bar executable. I am guessing it has something to do with the @Temp or @WorkingDir entries since those appear to be the only lines of code that could have issues related with a profile. I have tried all 3 of the RunAsSet options with no changes in functionality. I guess I need some help identifying any ares in the Progress Bar script that might be sensitive to user credentials or profile changes.

If $cmdline[0] = 2 Then
    $sOriginalDir = $cmdline[1]
    $sDestDir = $cmdline[2]
Else
    MsgBox(0,'Invalid # of parameters!',$cmdline[0]&' is an Invalid number of parameters.')
    Exit
EndIf

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...', '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
Link to comment
Share on other sites

I was sent to this code last week when I asked a question about copying files with a progress bar inside of AutoIT. The script works exactly as I want it to on its own, but I am having an issue with a RunAsSet command. If I remove the RunAsSet in the script that calls the progress bar executable it will work exactly as the original author intended, but nothing else in my script will work because of a lack of permissions. If I use the RunAsSet in my script everything works except for the Progress Bar executable. I am guessing it has something to do with the @Temp or @WorkingDir entries since those appear to be the only lines of code that could have issues related with a profile. I have tried all 3 of the RunAsSet options with no changes in functionality. I guess I need some help identifying any ares in the Progress Bar script that might be sensitive to user credentials or profile changes.

If you're having issues with the macros, @Temp/@WorkingDir, then just use explicit paths, C:\temp for example, and you can create the folder before you use it, then get rid of it when you're done.
Link to comment
Share on other sites

If you're having issues with the macros, @Temp/@WorkingDir, then just use explicit paths, C:\temp for example, and you can create the folder before you use it, then get rid of it when you're done.

That's the thing. I am not certain that these macros are the problem. After writing my original post I decided to add the following lines at the very beginning of the Progress Bar script to test the macro values.

MsgBox(0,"Temp",@TempDir)
MsgBox(0,"Com",@ComSpec)
MsgBox(0,"Work",@WorkingDir)

I added the same lines to the script that calls the progress bar thinking if there were differences that I would be able to fix it easy. Again the same problem. Those three message boxes do not appear if I use the RunAsSet command in my main script. If I remove the RunAsSet the boxes show up with the values that you would expect from the currently logged on user. It is as if the Command Lines are not getting passed to the script, but it does not return the "Invalid # of parameters" message you would think it would on a failure.

The important part of the script I am using to call this is below:

$USERNAME = "administrator"
$PASSWORD = "password"
$DOMAIN = "domain.com"
$RegVal = RegRead( "HKEY_LOCAL_MACHINE\SOFTWARE\CLAAS E.S.I.S\2.00.000\Setup", "Version")
If $RegVal <> "2.50.800" Then
;Setting Script to run as administrator.
    RunAsSet($USERNAME, $DOMAIN, $PASSWORD)
    Opt("WinWaitDelay",100)
    Opt("WinTitleMatchMode",4)
    Opt("WinDetectHiddenText",1)
    Opt("MouseCoordMode",0)
;Checking to see if the uninstall file for the previous version exists.  Execute uninstall if present.
    If FileExists("C:\Program Files\InstallShield Installation Information\{E5D7C143-32F3-437C-A84A-122563E25682}\Setup.exe") Then
        Run('"C:\Program Files\InstallShield Installation Information\{E5D7C143-32F3-437C-A84A-122563E25682}\Setup.exe" -uninst -removeonly' )
;Sending Keyboard commands to uninstall program.
        If Not WinActive("CLAAS E.S.I.S Caterpillar", "CLAAS E.S.I.S Caterpillar has been successfully") Then
            WinActivate("CLAAS E.S.I.S Caterpillar", "CLAAS E.S.I.S Caterpillar has been successfully")
            Sleep(1000)
            Send("!y")
            Sleep(9000)
            Send("{ENTER}")
        EndIf
    EndIf
;Calling Progress Bar script for file copying.
$OldFolder = DirGetSize("C:\CLAASCAT")
If $OldFolder <> -1 Then
    RunWait($Source & "\CLAAS\DirRemove.exe")
EndIf
MsgBox(0,"Debug", "Good so far")
DirCreate("c:\ClaasCat")
DriveMapAdd("x:", $Source)
MsgBox(0,"Temp",@TempDir)
MsgBox(0,"Com",@ComSpec)
MsgBox(0,"Work",@WorkingDir)
RunWait('x:\CLAAS\Progress_Bar.exe "x:\CLAAS\v2.5.8" "C:\ClaasCat"')
DriveMapDel("x:")
;Executing setup
Run('C:\ClaasCat\Setup.exe /s /v"qn"')
WinWait("CLAAS E.S.I.S Caterpillar Setup","The drive specificat")
It gets to the end of this portion of the script but just sits and waits for a window that will never appear because the setup files have not been copied. Any help is appreciated greatly. Edited by Anaxibius
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...