Anaxibius Posted January 10, 2006 Share Posted January 10, 2006 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. expandcollapse popupIf $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 More sharing options...
seandisanti Posted January 10, 2006 Share Posted January 10, 2006 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 More sharing options...
Anaxibius Posted January 10, 2006 Author Share Posted January 10, 2006 (edited) 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: expandcollapse popup$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 January 10, 2006 by Anaxibius Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now