cherrylatte

Second for loop not working

6 posts in this topic

#1 ·  Posted (edited)

Hi guys 

I am trying to execute each version of a browser (first for loop) and get a version of each of the file database by using SQLite tool. (second loop) 

The first for loop seems to work fine. But when it goes into a second loop, the second for loop seems to stop after like 1~2 times of looping.

I could not find the reason for it.  

If I separate those loops into each au3 files,,then it seems to work fine...I'll show you guys the code..I'd appreciate it if anybody finds a solution

#include <Array.au3>
#include <File.au3>
;#include <MsgBoxConstants.au3>


Opt("WinTitleMatchMode", 2)
Global $result_file1 = "C:\Users\hello\Desktop\result.txt"
Local $sFilePath1 = "C:\test"
Local $sFilePath2 = "C:\test\User Data"

Local $aFileList = _FileListToArray($sFilePath1 , "test*", Default, True) ;get the whole path of files starting with 'test' under C;test  and put it in array
Local $aSaltList = _FileListToArrayRec($sFilePath2,  "file db",1, -2 , 1, 2) ; get the whole path of files named ' file db' under 2 depth of userdata  folder

For $i=1 to UBound($aFileList)-1
   Sleep(3000)
   ShellExecute($aFileList[$i])

   Local $hWnd = WinWait("chrome"," ",10)

   WinActivate($hWnd)

   Sleep(6500)

   WinClose($hWnd)

   Sleep(100)

   ProcessClose ("chrome.exe")


   Sleep(4000)

Next

For $j=2 to UBound($aSaltList)-1
   Sleep(3000)

   ShellExecute($aSaltList[$j]) ;;PROBLEM

   Sleep(2000)

   ;sqlite
   Open()

   Sleep(3000)

  ;run sql
   RunSql()

Next


Func Open() ;open sqlitespy

Sleep(3000)

Send("s")
Sleep(1500)
Send("{ENTER}")

EndFunc

Func RunSql() ;run a sql sentence and save the result in a result.txt file

   ControlClick("[CLASS:TfrmMain]","","[CLASS:TDISynEdit]")
   Send("select * from version {F9}")

   ControlClick("[CLASS:TfrmMain]","","[CLASS:TMemo]","left",2)
   Sleep(1500)
   Send("^c")

   Local $string1 = ClipGet()
   FileWrite($result_file1, $aSaltList[$j])
   FileWrite($result_file1, "    ")
   FileWriteLine($result_file1, $string1)

   ProcessClose ("SQLiteSpy.exe")

EndFunc

 

Edited by cherrylatte

Share this post


Link to post
Share on other sites



When posting code, please use AutoIt code tags (that's the "<>" button in the editor). Greatly enhances readability of your code ;)

1 person likes this

My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (NEW 2017-04-18 - Version 1.4.8.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (NEW 2017-02-27 - Version 1.3.1.0) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2015-04-01 - Version 0.4.0.0) - Download - General Help & Support - Example Scripts
Excel - Example Scripts - Wiki
Word - Wiki
PowerPoint (2015-06-06 - Version 0.0.5.0) - Download - General Help & Support

Tutorials:
ADO - Wiki

 

Share this post


Link to post
Share on other sites

The only thing I can see from the code here is that ShellExecute might not be starting the file(s) given to it from the array.

Test if it works on one file...

Find out what program starts/runs the DB ( I assume ) file you are trying to start and write the code accordingly.

1 person likes this

Share this post


Link to post
Share on other sites
3 hours ago, water said:

When posting code, please use AutoIt code tags (that's the "<>" button in the editor). Greatly enhances readability of your code ;)

thanks I changed it

Share this post


Link to post
Share on other sites

I assume the problem is caused by the Sleep statements followed by Send.
When the application isn't ready after the Sleep the Send statement will never reach the application.

I suggest to use UDFs to automate Chrome and SQLite. You will find them in the wiki:
https://www.autoitscript.com/wiki/User_Defined_Functions

1 person likes this

My UDFs and Tutorials:

Spoiler

UDFs:
Active Directory (NEW 2017-04-18 - Version 1.4.8.0) - Download - General Help & Support - Example Scripts - Wiki
OutlookEX (NEW 2017-02-27 - Version 1.3.1.0) - Download - General Help & Support - Example Scripts - Wiki
ExcelChart (2015-04-01 - Version 0.4.0.0) - Download - General Help & Support - Example Scripts
Excel - Example Scripts - Wiki
Word - Wiki
PowerPoint (2015-06-06 - Version 0.0.5.0) - Download - General Help & Support

Tutorials:
ADO - Wiki

 

Share this post


Link to post
Share on other sites
On 2016. 8. 10. at 11:44 PM, water said:

I assume the problem is caused by the Sleep statements followed by Send.
When the application isn't ready after the Sleep the Send statement will never reach the application.

I suggest to use UDFs to automate Chrome and SQLite. You will find them in the wiki:
https://www.autoitscript.com/wiki/User_Defined_Functions

 

On 2016. 8. 10. at 8:57 PM, l3ill said:

The only thing I can see from the code here is that ShellExecute might not be starting the file(s) given to it from the array.

Test if it works on one file...

Find out what program starts/runs the DB ( I assume ) file you are trying to start and write the code accordingly.

Hi guys , I found out the reason why the second loop wasn't working.

It's because I miss placed below statement.

Local $aSaltList = _FileListToArrayRec($sFilePath2,  "file db",1, -2 , 1, 2) ; get the whole path of files named ' file db' under 2 depth of userdata  folder

 that statement has to be right after the end of first for_loop because the files supposed to be in aSaltList is not yet in complete state until the first for_loop finishes

anyways I appreciate for the help!

Share this post


Link to post
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

  • Similar Content

    • Eli_jahbot
      By Eli_jahbot
      My esteemed Autoits I need your help once again.
      I'm trying to figure out how to create a loop that gets 1 value from an array and repeats until each value from the array has been used. I have never used arrays before and I know once I learn more things should get easier for me. 
      Here is what Im trying to do:
      -Have an array of values that determine what application i log into. ex: app1, app2, app3, app4 etc.
      -Have a loop that repeats a process sequentially using each value in the array to finish the process for each app1, app2, app 3 and so forth. I have 30 apps that I need to update on a regular basis and getting this sorted out is what I perceive to be the best way to do it.
      Here is my feeble attempt that obviously fails:
      #include <msgboxconstants.au3>
      #include <Constants.au3>
      #include <array.au3>
      Login()
      Func Login()
          local $array[30] = ["10", "11", "12",etc etc]
          ;;Local $site = InputBox("ERx Site","What site do you want to login as?","","")
          Local $userid = InputBox("ERx Login", "What is your username?", "", "")
          Local $Passwd = InputBox("Security Check", "Enter your UAT password.", "", "*")
      for $1 = 1 to 30(I need to do the same steps in 30 different apps)
      run("Z:launch.exe")
      WinWaitActive("Input")
      Send (Sequential ARRAY VALUE HERE)
      Send("{ENTER}")
      WinWaitActive("window")
      Send($userid)
      Send("{TAB}")
      send($Passwd)
      Send("{ENTER}")
      WinWaitActive("[CLASS:SunAwtDialog]")
      Sleep(500)
      WinClose("Home Page")
      Next
      EndFunc
       
      your help is greatly appreciated.
      Thanks for your time
    • Szmycu
      By Szmycu
      Hello i Have HP Bar in my game and it has 170px of width and then im gonna find start of this by mouse pos then i got $hpStart[0] = 661  $hpStart[1] = 230 ,  $hpEnd[0] = 839
      And there is from $hpStart[0] = 661 the same color - 0xCB423B but depends of my points of hp for example on pixel  $hpStart[0] = 745 would be another color not  0xCB423B and then i will know my my character got 50% of health points.
       
      I encountered problem here - for loop still looping to 839 and not founding this change in color for example on pixel $hpStart[0] = 745
      I would know actual $i counter and $hpEnd[0] then only i can calculate current health percent value 
       
      Please help me how to achieve that! Thanks for any help
       
      Func MouseCord() $MousePos = MouseGetPos() global $hpStart = $MousePos global $hpEnd = $hpStart $hpEnd[0] = $hpEnd[0] + 170 For $i = $hpStart[0] To $hpEnd[0] ; Looping from 661 to 839 $pixel = PixelGetColor($i,$hpStart[1]) If $pixel <> 0xCB423B Then $hpNowPer = ( $hpEnd[0] - $i ) / 170 $hpPoOdjeciu = 1 - $hpNowPer $hpNowPercent = Round($hpPoOdjeciu,2) ExitLoop ; - that not working EndIf Next EndFunc  
       
    • 232showtime
      By 232showtime
      Good day,
      is it possible to make a For Loop infinite,
      ho do i make a for loop infinite??? using the script below
      For $i = 0 To 10 Msgbox(64, "Succes", $i) Next  
    • Relive
      By Relive
      An IE link collection $oLinks is being looped by a $oLink with a for-in loop. An if statement is used such that when the $oLink.href matches a string reg. exp., it will do a set of statements. The set of statements is this:

      $a = 1 do $matchpic = StringRegExp($oLink + $a.href, '(http://t2.imgchili.com/)(\d+)(\/)(\d+)(_)') $a += 1 until $matchpic = 1 But the error is that $a is not an object variable.

      After a match has been found, this $oLink is _paused_ at the current position inside this collection (I believe). How do I loop at the current $oLink?
    • BrewManNH
      By BrewManNH
      Here's a piece of code:

      Global $Array[5] = ["AA", "BB", "CC", "DD", "EE"] For $I = 2 To $Array ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $I = ' & $I & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console Next The results for this piece of code are very strange:

      Is this a bug with the For code, in that it's acting somewhat like a For/Next loop, and somewhat like a For/In/Next loop? By the way, it doesn't matter what the first number in the loop is, I used 2 as an example, it will always output the same. It takes the number you started the loop at, and then the variable will hold the contents of the second through the last array elements.
      On a 2D array, it still doesn't work as expected, but it works differently than how I'd expect it to.


      Global $Array[5][2] = [["AA", "1"], ["BB", 2], ["CC", 3], ["DD", 4],["EE", 5]] For $I = 10 To $Array ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $I = ' & $I & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console Next This outputs:

      Which is 5 instances of $ being 10, which seems to be a quick way of looping through an array if you don't need to access the contents of the array.