AutoitNew94 Posted March 9, 2011 Share Posted March 9, 2011 (edited) I am working on a function that replaces the standard DOS command ECHO. I have been searching through the help file for a little while now, and am curious as to how one might go about searching a string for sub strings meeting a certain criteria. So the string would be... Hello $World ...which would be passed from either the command line or an external script. I guess there would be two functions to accomplish this. First setting $World = Planet Second searching the string for any sub strings beginning with "$"SomeStr, but in the same respect ignoring something like "Hello $World ignore this $ as it is part of our string." So when outputted to the command prompt would result in... Hello Planet Ignore this $ as it is part of our string For arguments sake I will call the au3 script "ECHO.EXE" and "SET.EXE" for the variable sets after compiled. Now pretending that we have these two script written and compiled and we are now executing from the command prompt. Here is what I would like to accomplish. C:\>SET.EXE $World=Planet C:\>ECHO.EXE "Hello $World this is a test." Hello Planet this is a test. How would this be accomplished. I am looking at StringRegExp for the string manipulation, but have no idea how I would store user defined variables. Any and all input on this is very much appreciated. Thank You Edited March 9, 2011 by AutoitNew94 "You're not smart enough for me to open my inbox, so stop sending me mail." Link to comment Share on other sites More sharing options...
zorphnog Posted March 9, 2011 Share Posted March 9, 2011 (edited) I'm confused as to why you want to accomplish this as the standard ECHO command can print variables: >set WORLD=Planet >echo Hello %WORLD% this is a test. Hello Planet this is a test. The problem with what you're attempting is that you have no way of retaining and data unless you use file to do it. You would need your SET.EXE program to write to a file, and have your ECHO.EXE use this file to look up variables. Edited March 9, 2011 by zorphnog Link to comment Share on other sites More sharing options...
AutoitNew94 Posted March 9, 2011 Author Share Posted March 9, 2011 I'm confused as to why you want to accomplish this as the standard ECHO command can print variables: I have a few other ideas for adding some other functions to the ECHO command, but am starting off with the already existing, the fact that ECHO can interpret variables. The problem with what you're attempting is that you have no way of retaining and data unless you use file to do it. You would need your SET.EXE program to write to a file, and have your ECHO.EXE use this file to look up variables. Wouldn't there be a way to use the logic behind... For $i = 1 To... ...storing the variables to numbers and then checking those values, without the need of an external file? "You're not smart enough for me to open my inbox, so stop sending me mail." Link to comment Share on other sites More sharing options...
kylomas Posted March 9, 2011 Share Posted March 9, 2011 Autoitnew94, Define specifically what you mean by this:adding some other functions to the ECHO commandkylomas Forum Rules        Procedure for posting code "I like pigs. Dogs look up to us. Cats look down on us. Pigs treat us as equals." - Sir Winston Churchill Link to comment Share on other sites More sharing options...
Gui Posted March 9, 2011 Share Posted March 9, 2011 Hey. As for what your attempting, I donno if it's possible. If it is, I just donno how it would work. As I see you, you essentially wanna have a variable from AutoIt echoed, but the $ serves as an issue. Perhaps store the variables differently, like in a file? It's a bit confusing. 0_o Sorry, haven't really done anything related to what your doing. >;p Link to comment Share on other sites More sharing options...
AutoitNew94 Posted March 9, 2011 Author Share Posted March 9, 2011 Autoitnew94, Define specifically what you mean by this: kylomas Well for instance being able to chop up the string sending them to separate lines. In DOS it would be... C:\>echo.Hello&echo.World Hello World ...whereas quoted and unquoted strings in Autoit can produce this result automatically. If $Cmdline[0] > 0 Then For $i = 1 To $CmdLine[0] ConsoleWrite($CmdLine[$i] & @LF) Next EndIf I tried this once some time ago using a batch file to do this. @echo off setlocal :: BEGIN_FUNCTION set MAINStr=Hello $World $Hello World. set BYTEval=0 set NEXTval=0 :SUB-FUNCTION[BeginBYTELoop] set /a BYTEval=%BYTEval%+1 call set "StrByte=%%MAINStr:~0,%BYTEval%%%" set "StrChar=%StrByte:~-1%" if "%BYTE%"=="1" goto :VARByte if /i "%StrChar%"=="$" set BYTE=1&&goto :SUB-FUNCTION[BeginBYTELoop] if /i "%StrByte%"=="%MAINStr%" goto :eof goto :SUB-FUNCTION[BeginBYTELoop] :VARByte set /a NEXTval=%NEXTval%+1 if "%StrChar%"==" " ( call set "SUBStr=%%StrByte:~-%NEXTval%%%" call set "BYTE=" call :FoundString call set NEXTval=0 ) goto :SUB-FUNCTION[BeginBYTELoop] :FoundString for /f "tokens=1 delims= " %%- in ("%SUBStr%") do ( echo.%%- ) :: END_FUNCTION The idea was to find the variable strings and use +1 theory to assign each variable to a number and then search for those values and their corresponding strings, but I never got that far. I figure something in the same respect can be done in Autoit using the +1 theory to assign variables to numerical values. "You're not smart enough for me to open my inbox, so stop sending me mail." Link to comment Share on other sites More sharing options...
zorphnog Posted March 9, 2011 Share Posted March 9, 2011 Wouldn't there be a way to use the logic behind... For $i = 1 To... ...storing the variables to numbers and then checking those values, without the need of an external file? The problem is that your variables are volatile data. As soon as SET.EXE exits, your data is lost. Link to comment Share on other sites More sharing options...
AutoitNew94 Posted March 9, 2011 Author Share Posted March 9, 2011 The problem is that your variables are volatile data. As soon as SET.EXE exits, your data is lost.You are absolutely correct, so then I guess we combine the two, andjust call it NewCmd.exe, and run everything from one file.Lots and lots of functions, so now how might this idea be approached? "You're not smart enough for me to open my inbox, so stop sending me mail." Link to comment Share on other sites More sharing options...
kylomas Posted March 9, 2011 Share Posted March 9, 2011 (edited) Autoitnew94, You might want to do some searching on inter-process, inter-script communication to see what has been done before. However, there is no DOS api or interface of any kind that I know of so you are reduced to using an external storage medium (file, for instance). What about replacing BAT files with AutoIT, instead of trying to communicate with them? kylomas Edit: This just occurred to me...are you trying to write a functional equivalent to CMD.EXE? Edited March 9, 2011 by kylomas Forum Rules        Procedure for posting code "I like pigs. Dogs look up to us. Cats look down on us. Pigs treat us as equals." - Sir Winston Churchill Link to comment Share on other sites More sharing options...
AutoitNew94 Posted March 9, 2011 Author Share Posted March 9, 2011 (edited) Edit: This just occurred to me...are you trying to write a functional equivalent to CMD.EXE?In many ways yes and for no other purpose than for my own satisfaction. I know Powershell and, Au3Int exist.I would just like my own flavor as perl offers it own flavor to batch in the same respect.I should clarify though I do not wish to recode the wheel just maybe some extended utilities that I can use, but I would like to stick to the subject at hand as far as setting and storing variables and working with the echo command.Thank You Edited March 9, 2011 by AutoitNew94 "You're not smart enough for me to open my inbox, so stop sending me mail." Link to comment Share on other sites More sharing options...
AutoitNew94 Posted March 9, 2011 Author Share Posted March 9, 2011 (edited) Here is a small example of two scripts which share a variable. The Master sets the value in a dllstruct (whatever value is in the edit) and the slave reads from the memory used by the dll. If you had other windows then they can do the same as the slave and read form the same memory address in the same way. This is the master. When you run as a script it will also run the slave script, but the slave script must ba saved as "slave.au3" and be in the same folder as the master script. expandcollapse popup; *** Start added by AutoIt3Wrapper *** #include <GUIConstantsEx.au3> ; *** End added by AutoIt3Wrapper *** #AutoIt3Wrapper_Add_Constants=n #include <guiconstants.au3> #include <SecurityConstants.au3> #include <nomadmemory.au3> #include <editconstants.au3> Opt("GUIOnEventMode", 1) GUICreate("Master (sets variable)", 250, 70) $input = GUICtrlCreateInput("1", 20, 20, 120, 28, BitOR($GUI_SS_DEFAULT_INPUT, $ES_NUMBER)) GUISetState() GUISetOnEvent($GUI_EVENT_CLOSE, "done") $AutoItProdexePath = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\AutoIt v3\AutoIt", "InstallDir");installDir for production $output = DllStructCreate("int") $opAdd = DllStructGetPtr($output) $typeMesg = RegisterWindowMessage("someuniquetext10987") GUIRegisterMsg($typeMesg, "tellAddr"); respond to requests for the address to use $ToRun = '"' & $AutoItProdexePath & '\AutoIt3.exe"' & ' "' & @ScriptDir & '\slave.au3"' Run($ToRun) WinWait("Slave1", "", 30);wait up to 30 sec for slave If Not WinExists("Slave1") Then Exit Global $CurrentVal, $Lastval = -1 While 1 $CurrentVal = Number(GUICtrlRead($input)) If $CurrentVal <> $lastval Then DllStructSetData($output, 1, $CurrentVal) $lastval = $CurrentVal ConsoleWrite("set to "& $lastval & @CRLF) EndIf If not WinExists("Slave1") then exit WEnd Func tellAddr($hWndGUI, $MsgID, $WParam, $LParam) If $Wparam = 1 then Return $opAdd EndFunc ;==>tellAddr ;register window message ;returns a unique message number. if the message has already been registered then the ;the unique number for $stext is returned. ;Useful for two windows to communicate Func RegisterWindowMessage($sText) Local $aRet = DllCall('user32.dll', 'int', 'RegisterWindowMessage', 'str', $sText) Return $aRet[0] EndFunc ;==>RegisterWindowMessage Func done() Exit EndFunc This is the slave script which is run for you by the master. Instead, you could have 2 exe's and the master need not run the slave (remove the "Run" line) expandcollapse popup; *** Start added by AutoIt3Wrapper *** #include <GUIConstantsEx.au3> ; *** End added by AutoIt3Wrapper *** #AutoIt3Wrapper_Add_Constants=n #include <guiconstants.au3> #include <SecurityConstants.au3> #include <nomadmemory.au3> #include <SendMessage.au3> Opt("GUIOnEventMode", 1) $masterTitle = "Master (sets variable)" If Not WinExists($masterTitle) Then Exit;must run master first $wp = WinGetPos($masterTitle) GUICreate("Slave1", 250, 70,$wp[0],$wp[1]+$wp[3]) $labmem = GUICtrlCreateLabel("00000000000", 20, 20, 120, 28) GUISetState() GUISetOnEvent($GUI_EVENT_CLOSE, "done") ;get info on master Global $pid = WinGetProcess($masterTitle), $hid = WinGetHandle($masterTitle) Global $MemOpen = _MemoryOpen($pid), $memadd = 0 $typeMesg = RegisterWindowMessage("someuniquetext10987") $memadd = _SendMessage($hid, $typeMesg, 1);tell master we want address of variable ;master will reply with address to use $Lastval = -1 While 1 $CurrentVal = Get(1) If $Lastval <> $CurrentVal Then GUICtrlSetData($labmem, $CurrentVal) $lastVal = $CurrentVal EndIf sleep(50) if not winexists($masterTitle) then exit WEnd Func Get($var) ;only reads one int in this script so $var ignored Return _MemoryRead($memadd, $MemOpen, "int") EndFunc ;==>Get Func Set($var, $val);not used ;only write one int in this script so $var ignored _MemoryWrite($memadd, $MemOpen, $val, "int") EndFunc ;==>Set Func Done() Exit EndFunc ;==>Done Func RegisterWindowMessage($sText) Local $aRet = DllCall('user32.dll', 'int', 'RegisterWindowMessage', 'str', $sText) Return $aRet[0] EndFunc ;==>RegisterWindowMessage I went searching through the form and ran across this. Thanks to the original author, but this idea seems to present possibilities in what I am looking to accomplish. Edited March 9, 2011 by AutoitNew94 "You're not smart enough for me to open my inbox, so stop sending me mail." Link to comment Share on other sites More sharing options...
kylomas Posted March 9, 2011 Share Posted March 9, 2011 (edited) Autoitnew94, What you found is AI to AI communications. This will NOT work for DOS. Consider using environmental variables for rudimentary data passing (ENVGET, ENVSET and ENVUPDATE). kylomas Edit: Addendum Check out this link for how ripdad is processing output from CMD.EXE Edited March 10, 2011 by kylomas Forum Rules        Procedure for posting code "I like pigs. Dogs look up to us. Cats look down on us. Pigs treat us as equals." - Sir Winston Churchill Link to comment Share on other sites More sharing options...
Pallindrome Posted March 10, 2011 Share Posted March 10, 2011 Firstly, I'm assuming that this is a DOS window under Windows as opposed to a full DOS session initiated from a boot disk - there is a very important difference between the two! Part of the problem is that any call to a script, compiled or otherwise, will initiate a new instance of that script rather than using an already running instance. This means that creating redirecting scripts for "set" and echo" to point to a single master script "newcmd" and passing the parameters will still create a new instance of the script, so any memory variables used by previous (or still running) instances will be inaccessible. For workarounds, you could use the shell variable structure for storage of a limited amount of data, use a file storage (flat file, INI or XML) or even write the data to the registry for storage. It may also be possible to get a hook in to an existing running script by calling it via it's PID, but this may mean writing some extensions for AutoIt, similar to calling functions and procedures stored in an external .dll (which may not be a bad thing, but it would mean some pretty heavy development work!) The main method of attack so far is to get DOS to run AutoIt scripts from within its shell and maintain memory continuity between them. Lets put AutoIt outside the DOS box instead! Use the AutoIt script as the shell to execute the commands, and call CMD /c to execute those commands that aren't programmed into the main script! The result is that all the 'set' and 'echo' commands are now interpreted by the main AutoIt script, which remains in memory so all variables are available. Any commands not understood by the script can be passed off to an instance of cmd.exe, which returns control to the main script upon termination. Hopefully that will spark your imagination Link to comment Share on other sites More sharing options...
AutoitNew94 Posted March 10, 2011 Author Share Posted March 10, 2011 Hopefully that will spark your imagination That it most certainly does. Another day another learning curve. So I am borrowing this idea for my learning and testing purposes to try and understand more in depth exactly the best approach to accomplishing this project. Many thanks to Matt Diesel for his project and source on the AutoIt3 Interpreter. I have been pulling apart this code piece by piece function by function to try and better understand what exactly is going on. Now if I run the source run cmd.exe from it it spawns a new process of cmd.exe but it is at least showing me how to work with Autoit from the command console. This I think is what I am after, the idea that is, being able to execute DOS commands from the Interpreter in stead of interpreting Autoit commands and then from there building extended functionality on top of the already built in functions of cmd as well as any extended utilities. ...or maybe the idea of just creating an entirely new GUI to go with it and leaving cmd out completely. Here is the source torn down to at least keep the window open. Now I am sure all of this is not needed to accomplish this, so my question is what are the most important parts needed to work with cmd? Matt Diesel's Source: expandcollapse popup#NoTrayIcon #region ;**** Directives created by AutoIt3Wrapper_GUI **** #AutoIt3Wrapper_icon=Au3Int.ico #AutoIt3Wrapper_outfile=Au3Int.exe #AutoIt3Wrapper_Change2CUI=Y #AutoIt3Wrapper_Res_Comment=http://www.autoitscript.com/autoit3/ #AutoIt3Wrapper_Res_Description=The dynamic interpreter for AutoIt3 #AutoIt3Wrapper_Res_Fileversion=1.0.2.10 #AutoIt3Wrapper_Res_LegalCopyright=Copyright © Matt Diesel (Mat) 2010 #AutoIt3Wrapper_Res_Field=Author|Matt Diesel (Mat) #AutoIt3Wrapper_Res_Field=OriginalFilename|Au3Int.exe #AutoIt3Wrapper_Res_Field=ProductName|Au3Int #AutoIt3Wrapper_Res_Field=AutoItVersion|3.3.6.1 #AutoIt3Wrapper_Res_Icon_Add=C:\Program Files\AutoIt3\Icons\au3script_v10.ico #AutoIt3Wrapper_AU3Check_Stop_OnWarning=y #AutoIt3Wrapper_AU3Check_Parameters=-d -w 1 -w 2 -w 4 -w 5 -w 6 #AutoIt3Wrapper_Run_After=MD "%scriptdir%\Versions\au3int\%fileversion%" #AutoIt3Wrapper_Run_After=MD "%scriptdir%\Versions\au3int\%fileversion%\source" #AutoIt3Wrapper_Run_After=COPY "%in%" "%scriptdir%\Versions\au3int\%fileversion%\source\%scriptfile%.au3" #AutoIt3Wrapper_Run_After=COPY "%icon%" "%scriptdir%\Versions\au3int\%fileversion%\source\%scriptfile%.ico" #AutoIt3Wrapper_Run_After=COPY "%scriptdir%\au3int.chm" "%scriptdir%\Versions\au3int\%fileversion%\au3int.chm" #AutoIt3Wrapper_Run_After=MOVE "%out%" "%scriptdir%\Versions\au3int\%fileversion%\%scriptfile%.exe" #AutoIt3Wrapper_Run_After=DEL /F /Q "Au3Int_obfuscated.au3" #Tidy_Parameters=/sf #AutoIt3Wrapper_Run_Obfuscator=y #Obfuscator_Parameters=/cs=0 /cn=0 /cf=1 /cv=1 /sf=0 /sv=0 #endregion ;**** Directives created by AutoIt3Wrapper_GUI **** Global $hKERNEL32 Global $hPSAPI Global $hConsoleOutput Global $hConsoleInput Global $sCode = "" Global $iLimit = 400 _Au3Int_Start() If $CmdLine[0] <> 0 Then _Au3Int_CommandLine() While _Au3Int_Proc() WEnd Func _Au3Int_ArrayParse($asInd, $j) ; wraithdu Local $sInStr = "", $iInFunc = 0, $iInDef = 0, $sTemp = "" For $j = $j To StringLen($asInd) Switch StringMid($asInd, $j, 1) Case """" If $sInStr = "" Then $sInStr = """" ElseIf $sInStr = """" Then $sInStr = "" EndIf $sTemp &= """" Case "'" If $sInStr = "" Then $sInStr = "'" ElseIf $sInStr = "'" Then $sInStr = "" EndIf $sTemp &= "'" Case "(" If $sInStr = "" Then $iInFunc += 1 $sTemp &= "(" Case ")" If $sInStr = "" Then $iInFunc -= 1 $sTemp &= ")" Case "[" If $sInStr <> "" Or $iInFunc Then $sTemp &= "[" ContinueLoop EndIf If $iInDef Then $sTemp &= "[" $iInDef += 1 Case "]" If $sInStr <> "" Or $iInFunc Then $sTemp &= "]" ContinueLoop EndIf $iInDef -= 1 If $iInDef Then $sTemp &= "]" Else ; end of dimension definition Return SetError(0, $j, $sTemp) EndIf Case Else $sTemp &= StringMid($asInd, $j, 1) EndSwitch Next EndFunc ;==>_Au3Int_ArrayParse Func _Au3Int_AssignArray(ByRef $aArray, $aDim, $vValue) Switch $aDim[0] Case 1 $aArray[$aDim[1]] = $vValue Case 2 $aArray[$aDim[1]][$aDim[2]] = $vValue Case 3 $aArray[$aDim[1]][$aDim[2]][$aDim[3]] = $vValue Case 4 $aArray[$aDim[1]][$aDim[2]][$aDim[3]][$aDim[4]] = $vValue Case 5 $aArray[$aDim[1]][$aDim[2]][$aDim[3]][$aDim[4]][$aDim[5]] = $vValue Case 6 $aArray[$aDim[1]][$aDim[2]][$aDim[3]][$aDim[4]][$aDim[5]][$aDim[6]] = $vValue Case Else _Console_Write("Error in array statement. The interpreter supports a maximum of 6 dimensions." & @CRLF) Return SetError(1) EndSwitch EndFunc ;==>_Au3Int_AssignArray Func _Au3Int_AutoItInfo() Local $s = "HKLM\SOFTWARE\AutoIt v3\AutoIt" If @OSArch = "X64" Then $s = "HKLM\SOFTWARE\Wow6432Node\AutoIt v3\AutoIt" Local $sBetaVer = RegRead($s, "betaVersion") Local $sVer = RegRead($s, "Version") If @error And $sBetaVer = "" Then _Console_Write("AutoIt v3 is not installed on this computer." & @CRLF) Return EndIf Local $sDir = RegRead($s, "InstallDir") _Console_Write("AutoIt3 (" & $sVer & ") is installed in: " & $sDir & @CRLF) If $sBetaVer <> "" Then $sDir = RegRead($s, "betaInstallDir") If Not @error Then _Console_Write("AutoIt3 Beta (" & $sBetaVer & ") is installed in: " & $sDir & @CRLF) Switch RegRead("HKCR\.au3", "") Case "AutoIt3Script" _Console_Write("Currently using release version." & @CRLF) Case "AutoIt3ScriptBeta" _Console_Write("Currently using beta version." & @CRLF) EndSwitch EndIf EndFunc ;==>_Au3Int_AutoItInfo Func _Au3Int_Clr() Local $tScreenBufferInfo = _Console_GetConsoleScreenBufferInfo() _Console_FillOutputCharacter(" ", DllStructGetData($tScreenBufferInfo, "SizeX") * (DllStructGetData($tScreenBufferInfo, "SizeY")), 0, 0) _Console_SetCursorPos(0, 0) Return True EndFunc ;==>_Au3Int_Clr Func _Au3Int_ClrLine() Local $tScreenBufferInfo = _Console_GetConsoleScreenBufferInfo() _Console_FillOutputCharacter(" ", DllStructGetData($tScreenBufferInfo, "SizeX"), 0, DllStructGetData($tScreenBufferInfo, "CursorPositionY") - 1) _Console_SetCursorPos(0, DllStructGetData($tScreenBufferInfo, "CursorPositionY") - 1) Return True EndFunc ;==>_Au3Int_ClrLine Func _Au3Int_CommandLine() _Console_Write("Running: " & $CmdLine[1] & @CRLF) Local $hTimer = TimerInit() Local $iCode = RunWait("""" & @AutoItExe & """ /ErrorStdOut /AutoIt3ExecuteScript """ & $CmdLine[1] & """", @ScriptDir, Default, 0x10) _Console_Write("Exited code: " & $iCode & ", took: " & Round(TimerDiff($hTimer)) & "ms" & @CRLF) RunWait(@ComSpec & " /c PAUSE", @ScriptDir, Default, 0x10) Exit EndFunc ;==>_Au3Int_CommandLine Func _Au3Int_CommaSplit($sInput) Local $sInStr = "", $iInDef = 0, $iInFunc = 0, $aRet[2] = [1, ""] For $i = 1 To StringLen($sInput) Switch StringMid($sInput, $i, 1) Case """" If $sInStr = "" Then $sInStr = """" ElseIf $sInStr = """" Then $sInStr = "" EndIf Case "'" If $sInStr = "" Then $sInStr = "'" ElseIf $sInStr = "'" Then $sInStr = "" EndIf Case "(" If $sInStr = "" Then $iInFunc += 1 Case ")" If $sInStr = "" Then $iInFunc -= 1 Case "[" If $sInStr = "" Then $iInDef += 1 Case "]" If $sInStr = "" Then $iInDef -= 1 Case "," If ($sInStr = "") And ($iInDef = 0) And ($iInFunc = 0) Then ; Good :) Add a new item to the array $aRet[0] += 1 ReDim $aRet[$aRet[0] + 1] ContinueLoop EndIf EndSwitch $aRet[$aRet[0]] &= StringMid($sInput, $i, 1) Next Return $aRet EndFunc ;==>_Au3Int_CommaSplit Func _Au3Int_CreateArray($aDim) Switch $aDim[0] Case 1 Local $aVar[$aDim[1]] Case 2 Local $aVar[$aDim[1]][$aDim[2]] Case 3 Local $aVar[$aDim[1]][$aDim[2]][$aDim[3]] Case 4 Local $aVar[$aDim[1]][$aDim[2]][$aDim[3]][$aDim[4]] Case 5 Local $aVar[$aDim[1]][$aDim[2]][$aDim[3]][$aDim[4]][$aDim[5]] Case 6 Local $aVar[$aDim[1]][$aDim[2]][$aDim[3]][$aDim[4]][$aDim[5]][$aDim[6]] Case Else _Console_Write("Error in array declaration. The interpreter supports a maximum of 6 dimensions." & @CRLF) Return SetError(1) EndSwitch Return $aVar EndFunc ;==>_Au3Int_CreateArray Func _Au3Int_EvalArray($aArray, $aDim) Switch $aDim[0] Case 1 Return $aArray[$aDim[1]] Case 2 Return $aArray[$aDim[1]][$aDim[2]] Case 3 Return $aArray[$aDim[1]][$aDim[2]][$aDim[3]] Case 4 Return $aArray[$aDim[1]][$aDim[2]][$aDim[3]][$aDim[4]] Case 5 Return $aArray[$aDim[1]][$aDim[2]][$aDim[3]][$aDim[4]][$aDim[5]] Case 6 Return $aArray[$aDim[1]][$aDim[2]][$aDim[3]][$aDim[4]][$aDim[5]][$aDim[6]] Case Else _Console_Write("Error in array statement. The interpreter supports a maximum of 6 dimensions." & @CRLF) Return SetError(1) EndSwitch EndFunc ;==>_Au3Int_EvalArray Func _Au3Int_GetArrayElem($sInput, $iDim) ; wraithdu $sInput = StringStripWS($sInput, 3) $sInput = StringMid($sInput, 2, StringLen($sInput) - 2) ; strip outside [ ] $sInput = _Au3Int_CommaSplit($sInput) ReDim $sInput[$iDim + 2] ; prevent out of bounds errors Return StringStripWS($sInput[$iDim + 1], 3) EndFunc ;==>_Au3Int_GetArrayElem Func _Au3Int_GetOp($sInput, $sOp) ; wraithdu Local $sInStr = "", $iInFunc = 0, $iInDef = 0 For $i = 1 To StringLen($sInput) Switch StringMid($sInput, $i, 1) Case """" If $sInStr = "" Then $sInStr = """" ElseIf $sInStr = """" Then $sInStr = "" EndIf Case "'" If $sInStr = "" Then $sInStr = "'" ElseIf $sInStr = "'" Then $sInStr = "" EndIf Case "(" If $sInStr = "" Then $iInFunc += 1 Case ")" If $sInStr = "" Then $iInFunc -= 1 Case "[" If $sInStr = "" Then $iInDef += 1 Case "]" If $sInStr = "" Then $iInDef -= 1 Case $sOp If ($sInStr = "") And (Not $iInFunc) And (Not $iInDef) Then Return $i EndSwitch Next Return 0 EndFunc ;==>_Au3Int_GetOp Func _Au3Int_Install($fInstall = True) Local $sKey = "HKCR\Au3IntTempScript" If $fInstall Then RegWrite("HKCR\.au3", "", "REG_SZ", "Au3IntTempScript") RegWrite($sKey, "", "REG_SZ", "AutoIt v3 Script") RegWrite($sKey & "\DefaultIcon\", "", "REG_SZ", @ScriptFullPath & ",4") RegWrite($sKey & "\Shell\", "", "REG_SZ", "Run") RegWrite($sKey & "\Shell\Run", "", "REG_SZ", "Run Script") RegWrite($sKey & "\Shell\Run\Command", "", "REG_SZ", """" & @ScriptFullPath & """ /AutoIt3ExecuteScript ""%1"" %*") RegWrite($sKey & "\Shell\Runwo", "", "REG_SZ", "Run with console") RegWrite($sKey & "\Shell\Runwo\Command", "", "REG_SZ", """" & @ScriptFullPath & """ ""%1"" %*") RegWrite($sKey & "\Shell\Edit", "", "REG_SZ", "Edit") RegWrite($sKey & "\Shell\Edit\Command", "", "REG_SZ", "notepad.exe %1") _Console_Write("AutoIt3 Scripts associated with the interpreter." & @CRLF) Else RegDelete("HKCR\.au3") RegDelete($sKey) EndIf EndFunc ;==>_Au3Int_Install Func _Au3Int_NQReplace($sInput, $sFind, $sReplace) Local $sInStr = "", $sRet = "" For $i = 1 To StringLen($sInput); - StringLen($sFind) Switch StringMid($sInput, $i, 1) Case """" If $sInStr = "" Then $sInStr = """" ElseIf $sInStr = """" Then $sInStr = "" EndIf Case "'" If $sInStr = "" Then $sInStr = "'" ElseIf $sInStr = "'" Then $sInStr = "" EndIf Case Else If ($sInStr = "") And (StringMid($sInput, $i, StringLen($sFind)) = $sFind) Then $sRet &= $sReplace $i += StringLen($sReplace) - 1 ContinueLoop EndIf EndSwitch $sRet &= StringMid($sInput, $i, 1) Next Return $sRet EndFunc ;==>_Au3Int_NQReplace Func _Au3Int_OnExitProc() _Console_Write(@CRLF & "Saving Settings..." & @CRLF) ; Must use full path for regedit. Note that the settings are stored for AutoIt3.exe when running un-compiled. Local $sKey = "HKEY_CURRENT_USER\Console\" & StringReplace(@AutoItExe, "\", "_") RunWait("regedit /E settings.reg """ & $sKey & """", @ScriptDir, Default) RegDelete($sKey) _Console_Write(@CRLF & "Tidying up..." & @CRLF) FileDelete("code.au3") ;~ _Console_FreeConsole() ; Causes problems for some reason. _Console_Write(@CRLF & "Closing open handles..." & @CRLF) ;~ DllCallbackFree($hHandlerRoutine) ; Causes problems for some reason. DllClose($hKERNEL32) DllClose($hPSAPI) $hKERNEL32 = 0 $hPSAPI = 0 Exit EndFunc ;==>_Au3Int_OnExitProc Func _Au3Int_PrintHead() If @Compiled Then _Console_Write("AutoIt3 Interpreter version: " & FileGetVersion(@ScriptFullPath) & @CRLF & _ "Copyright (c) Matt Diesel (Mat) 2010" & @CRLF & @CRLF) Else _Console_Write("AutoIt3 Interpreter version: (Not compiled)" & @CRLF & _ "Copyright (c) Matt Diesel (Mat) 2010" & @CRLF & "WARNING: Internal variable names are not mangled." & @CRLF & @CRLF) EndIf EndFunc ;==>_Au3Int_PrintHead Func _Au3Int_Start() $hKERNEL32 = DllOpen("kernel32.dll") $hPSAPI = DllOpen("psapi.dll") ; Update settings. If FileExists(@ScriptDir & "\settings.reg") Then RunWait("regedit /S settings.reg", @ScriptDir) ;If Not @Compiled Then _Console_AllocConsole() _Console_AllocConsole() $hConsoleOutput = _Console_GetStdHandle(-11) $hConsoleInput = _Console_GetStdHandle(-10) Local $sTitle = "AutoIt3 Interpreter" If IsAdmin() Then $sTitle &= " (Administrator)" If Not @Compiled Then $sTitle &= " (Not compiled)" _Console_SetTitle($sTitle) If Not @Compiled And FileExists(@ScriptDir & "\Au3Int.ico") Then _ _Console_SetIcon(@ScriptDir & "\Au3Int.ico") _Au3Int_PrintHead() WinActivate(_Console_GetConsoleWindow()) EndFunc ;==>_Au3Int_Start Func _Console_AllocConsole() Local $aResult = DllCall($hKERNEL32, "bool", "AllocConsole") If @error Then Return SetError(@error, @extended, 0) Return $aResult[0] EndFunc ;==>_Console_AllocConsole Func _Console_GetStdHandle($nStdHandle = -11) Local $aResult = DllCall($hKERNEL32, "handle", "GetStdHandle", "dword", $nStdHandle) If @error Then Return SetError(@error, @extended, 0) Return $aResult[0] EndFunc ;==>_Console_GetStdHandle Func _Console_SetTitle($sTitle) Local $aResult = DllCall($hKERNEL32, "bool", "SetConsoleTitleA", "str", $sTitle) If @error Then Return SetError(@error, @extended, False) Return $aResult[0] EndFunc ;==>_Console_SetTitle Func _Console_Write($sText) Local $aResult $aResult = DllCall($hKERNEL32, "bool", "WriteConsoleA", "handle", $hConsoleOutput, "str", $sText, "dword", StringLen($sText), "dword*", 0, "ptr", 0) If @error Then Return SetError(@error, @extended, False) Return SetExtended($aResult[4], $aResult[0]) EndFunc ;==>_Console_Write Func _Console_GetConsoleWindow() Local $aResult = DllCall($hKERNEL32, "hwnd", "GetConsoleWindow") If @error Then Return SetError(@error, @extended, 0) Return $aResult[0] EndFunc ;==>_Console_GetConsoleWindow Func _Au3Int_Proc() Local $sInput, $s__InternalInputCopy Local $error = 0, $extended = 0 Local $iPrint ; 0 => Default, 1 = All, 2 = None Local $tScreenBufferInfo = DllStructCreate("SHORT SizeX; SHORT SizeY;SHORT CursorPositionX;" & _ "SHORT CursorPositionY; SHORT Attributes;SHORT Left; SHORT Top; SHORT Right; SHORT Bottom;" & _ "SHORT MaximumWindowSizeX; SHORT MaximumWindowSizeY") While 1 DllCall($hPSAPI, "int", "EmptyWorkingSet", "long", -1) DllCall($hKERNEL32, "bool", "GetConsoleScreenBufferInfo", _ "handle", $hConsoleOutput, _ "ptr", DllStructGetPtr($tScreenBufferInfo)) If DllStructGetData($tScreenBufferInfo, "CursorPositionX") > 1 Then _Console_Write(@CRLF) _Console_Write("Au3Int -> ") _Console_FlushInputBuffer() $sInput = _Au3Int_Read() $sInput = StringStripWS($sInput, 3) $s__InternalInputCopy = $sInput If StringLeft($sInput, 4) = "all:" Then $iPrint = 1 $sInput = StringStripWS(StringTrimLeft($sInput, 4), 3) ElseIf StringLeft($sInput, 5) = "none:" Then $iPrint = 2 $sInput = StringStripWS(StringTrimLeft($sInput, 5), 3) Else $iPrint = 0 EndIf Switch $sInput Case "" _Au3Int_ClrLine() ContinueLoop Case "cap" _Console_Write("Output limit: " & $iLimit & @CRLF) Case "glass on" If Not _Console_BlurBehind() Then _ _Console_Write("Error setting glass. Requires vista or higher." & @CRLF) Case "glass off" If Not _Console_BlurBehind(False) Then _ _Console_Write("Error un-setting glass. Requires vista or higher." & @CRLF) Case "restart" If @Compiled Then Run("""" & @ScriptFullPath & """", @ScriptDir, Default, 0x10) Else Run("""" & @AutoItExe & """ /AutoIt3ExecuteScript """ & @ScriptFullPath & """", @ScriptDir, Default, 0x10) EndIf Exit Case "autoitinfo" _Au3Int_AutoItInfo() Case "install" If Not @Compiled Then _Console_Write("Au3Int must be compiled to build associations." & @CRLF) ContinueLoop EndIf RegRead("HKCR\.au3", "") If Not @error Then _Console_Write("AutoIt3 Scripts are already associated with a program." & @CRLF) ContinueLoop EndIf _Au3Int_Install(True) Case "uninstall" If RegRead("HKCR\.au3", "") = "Au3IntTempScript" Then _Au3Int_Install(False) Else _Console_Write("AutoIt3 Scripts are not associated with the interpreter." & @CRLF) EndIf Case "sciteinfo" _Au3Int_SciTEInfo() Case "@error", "error" _Console_Write($error & @CRLF) Case "@extended", "extended" _Console_Write($extended & @CRLF) Case "resetvars", "clv" $sCode = "" Return True Case "reset", "clear", "clr", "cls", "cmd cls" $sCode = "" If Not _Au3Int_Clr() Then _ _Console_Write("Error clearing the console. Code: " & @error & @CRLF) Case "help", "?", "hlp" ; Give help If Not FileExists("Au3Int.chm") Then _Console_Write("Cannot find 'Au3Int.chm' in the program directory." & @CRLF) ContinueLoop EndIf ShellExecute("Au3Int.chm") Case "code" _Au3Int_RunCode() Case "exit", "close" _Au3Int_OnExitProc() Return False Case Else ; Line continuations allowed While StringRight($sInput, 1) = "_" _Console_Write(" > ") $sInput = StringTrimRight($sInput, 1) & _Au3Int_Read() WEnd ; Strip comments. Local $sInStr = "" For $i = 1 To StringLen($sInput) Switch StringMid($sInput, $i, 1) Case """" If $sInStr = "" Then $sInStr = """" ElseIf $sInStr = """" Then $sInStr = "" EndIf Case "'" If $sInStr = "" Then $sInStr = "'" ElseIf $sInStr = "'" Then $sInStr = "" EndIf Case ";" If $sInStr = "" Then $sInput = StringLeft($sInput, $i) ExitLoop EndIf EndSwitch Next $sInStr = 0 $sInput = StringStripWS($sInput, 3) Switch StringLower(StringStripWS(StringLeft($sInput, StringInStr($sInput, " ")), 3)) Case "cap" $sInput = StringStripWS(StringTrimLEft($sInput, 3), 3) If Not StringIsInt($sInput) Then _Console_Write("Expected an integer to be used to limit output." & @CRLF) Else $iLimit = Int($sInput) _Console_Write("Cap set to " & $iLimit & @CRLF) EndIf ContinueLoop Case "cmd" $sInput = StringStripWS(StringTrimLeft($sInput, 4), 3) RunWait(@ComSpec & " /c " & $sInput) ContinueLoop Case "redim" $sInput = StringStripWS(StringTrimLeft($sInput, 6), 3) If StringLeft($sInput, 1) <> "$" Then _Console_Write("Error parsing ReDim statement. Expected '$'." & @CRLF) ContinueLoop EndIf $sInput = StringTrimLeft($sInput, 1) If Not StringInStr($sInput, "[") Then _Console_Write("Error parsing ReDim statement. Expected '['." & @CRLF) ContinueLoop EndIf Local $asInd = StringTrimLeft($sInput, StringInStr($sInput, "[") - 1) ; array dimensions, ie [1][2][3] Local $sFinal = "", $sTemp For $j = 1 To StringLen($asInd) $sTemp = _Au3Int_ArrayParse($asInd, $j) $j = @extended $sTemp = Execute($sTemp) $sFinal &= "[" & $sTemp & "]" If @error And $sTemp = "" Then _Console_Write("Error in array statement. '" & $sTemp & "' does not evaluate to a valid number." & @CRLF) ContinueLoop 2 EndIf Next Local $sVar = StringLeft($sInput, StringInStr($sInput, "[") - 1) $asInd = StringMid($sFinal, 2, StringLen($sFinal) - 2) $asInd = StringSplit($asInd, "][", 1) $sTemp = 0 $sFinal = 0 If Not IsDeclared($sVar) Then _Console_Write("Error in ReDim statement. Variable '" & $sVar & "' is not declared." & @CRLF) ContinueLoop EndIf Local $aVar = Eval($sVar) If Not IsArray($aVar) Then _Console_Write("Error in ReDim statement. Variable '" & $sVar & "' is not an array." & @CRLF) ContinueLoop EndIf If UBound($aVar, 0) <> $asInd[0] Then _Console_Write("Error in ReDim statement. '" & $sVar & "' has " & UBound($aVar, 0) & " dimensions, attempted to ReDim with " & $asInd[0] & "." & @CRLF) ContinueLoop EndIf For $i = 1 To $asInd[0] If Not StringIsInt($asInd[$i]) Then _Console_Write("Error in ReDim statement. Dimension " & $i & " ('" & $asInd[$i] & "') is not a number." & @CRLF) ContinueLoop 2 EndIf $asInd[$i] = Int($asInd[$i]) If $asInd[$i] < 1 Then _Console_Write("Error in ReDim statement. Dimension " & $i & " ('" & $asInd[$i] & "') is less than one." & @CRLF) ContinueLoop 2 EndIf Next Switch $asInd[0] Case 1 ReDim $aVar[$asInd[1]] Case 2 ReDim $aVar[$asInd[1]][$asInd[2]] Case 3 ReDim $aVar[$asInd[1]][$asInd[2]][$asInd[3]] Case 4 ReDim $aVar[$asInd[1]][$asInd[2]][$asInd[3]][$asInd[4]] Case 5 ReDim $aVar[$asInd[1]][$asInd[2]][$asInd[3]][$asInd[4]][$asInd[5]] Case 6 ReDim $aVar[$asInd[1]][$asInd[2]][$asInd[3]][$asInd[4]][$asInd[5]][$asInd[6]] Case Else _Console_Write("Error in ReDim statement. The interpreter supports a maximum of 6 dimensions." & @CRLF) ContinueLoop EndSwitch Assign($sVar, $aVar) _Au3Int_PrintVar($aVar, "", $iPrint) $asInd = 0 $sVar = 0 $aVar = 0 ContinueLoop Case "local", "global", "dim", "static" $sInput = StringStripWS(StringTrimLeft($sInput, StringInStr($sInput, " ")), 3) Local $asVars = _Au3Int_CommaSplit($sInput), $sData For $i = 1 To $asVars[0] $asVars[$i] = StringStripWS($asVars[$i], 3) If Not _Au3Int_GetOp($asVars[$i], "=") Then $sVar = StringStripWS($asVars[$i], 3) $sData = "" Else $sData = StringStripWS(StringMid($asVars[$i], _Au3Int_GetOp($asVars[$i], "=") + 1), 3) $sVar = StringStripWS(StringMid($asVars[$i], 1, _Au3Int_GetOp($asVars[$i], "=") - 1), 3) EndIf If StringLeft($sVar, 1) <> "$" Then _Console_Write("Error parsing variable declaration: " & $i & ", expected '$'." & @CRLF) ContinueLoop Else $sVar = StringTrimLeft($sVar, 1) EndIf If StringInStr($sVar, "[") Then ; Array Local $asInd = StringTrimLeft($sVar, StringInStr($sVar, "[") - 1) ; array dimensions, ie [1][2][3] Local $sFinal = "", $sTemp For $j = 1 To StringLen($asInd) $sTemp = _Au3Int_ArrayParse($asInd, $j) $j = @extended $sTemp = Execute($sTemp) If @error And $sTemp = "" Then _Console_Write("Error in array statement. '" & $sTemp & "' does not evaluate to a valid number." & @CRLF) ContinueLoop 3 EndIf $sFinal &= "[" & $sTemp & "]" Next $sVar = StringLeft($sVar, StringInStr($sVar, "[") - 1) ; var without leading $ $asInd = StringMid($sFinal, 2, StringLen($sFinal) - 2) ; strip outside [ ] $asInd = StringSplit($asInd, "][", 1) $sTemp = 0 $sFinal = 0 For $j = 1 To $asInd[0] $asInd[$j] = Execute($asInd[$j]) If Not StringIsInt($asInd[$j]) Then _Console_Write("Error in array declaration. Dimension " & $j & " ('" & $asInd[$j] & "') is not a number." & @CRLF) ContinueLoop 2 EndIf $asInd[$j] = Int($asInd[$j]) If $asInd[$j] < 1 Then _Console_Write("Error in array declaration. Dimension " & $j & " ('" & $asInd[$j] & "') is less than one." & @CRLF) ContinueLoop 2 EndIf Next Local $aVar = _Au3Int_CreateArray($asInd) ; Thanks to Wraithdu for the assignment code :) If $sData <> "" Then ; Data checking $sData = StringStripWS($sData, 3) If StringLeft($sData, 1) <> "[" Then _Console_Write("Error in array declaration. Expected opening bracket ('[') in data." & @CRLF) ContinueLoop EndIf If StringRight($sData, 1) <> "]" Then _Console_Write("Error in array declaration. Expected closing bracket (']') to end data." & @CRLF) ContinueLoop EndIf ; init counter array Local $aDim[UBound($aVar, 0) + 1], $vTmp $aDim[0] = UBound($aVar, 0) For $n = 1 To $aDim[0] $aDim[$n] = UBound($aVar, $n) - 1 Next Local $aTmp = $aDim ; assign values While 1 $vTmp = $sData ; loop through to break down the array For $n = 1 To UBound($aTmp) - 1 $vTmp = _Au3Int_GetArrayElem($vTmp, Number($aTmp[$n])) Next $vTmp = Execute($vTmp) _Au3Int_AssignArray($aVar, $aTmp, $vTmp) If @error Then ContinueLoop 2 ; next element For $n = $aDim[0] To 1 Step -1 ; decrement last element $aTmp[$n] -= 1 If $n = 1 And $aTmp[$n] < 0 Then ; DONE ExitLoop 2 ElseIf $aTmp[$n] < 0 Then $aTmp[$n] = $aDim[$n] ; reset this element ; move left one element ; continue Else ; got next element ExitLoop EndIf Next WEnd EndIf Assign($sVar, $aVar, 1) _Au3Int_PrintVar($aVar, "", $iPrint) $asInd = 0 $aVar = 0 $vTmp = 0 $aTmp = 0 $aDim = 0 ElseIf $sData <> "" Then ; only assign data to non-array variables $sData = Execute($sData) If @error And ($sData = "") Then _Console_Write("Error parsing variable declaration: " & $i & ", Data is incorrect: '" & $sData & "'." & @CRLF) Else If IsDeclared($sVar) Then _ _Console_Write("Warning on variable declaration: " & $i & ", Variable is already declared. (re-assigned)" & @CRLF) If Assign($sVar, $sData, 1) = 0 Then _Console_Write("Error parsing variable declaration: " & $i & ", Error assigning variable." & @CRLF) Else _Au3Int_PrintVar($sData, "", $iPrint) EndIf EndIf EndIf Next $sVar = 0 $asVars = 0 $sData = 0 $sCode &= $s__InternalInputCopy & @CRLF ContinueLoop Case "func" _Console_Write("You'll need to try out the new beta V2 Au3Int to define functions..." & @CRLF) ContinueLoop Case "if" If StringRight($sInput, 4) = "Then" Then _Console_Write("If test not ended. Would return " & (Execute(StringMid($sInput, 3, StringLen($sInput) - 7)) = True) & "." & @CRLF) ContinueLoop Else Local $sInStr = "" For $i = 1 To StringLen($sInput) Switch StringMid($sInput, $i, 1) Case """" If $sInStr = "" Then $sInStr = """" ElseIf $sInStr = """" Then $sInStr = "" EndIf Case "'" If $sInStr = "" Then $sInStr = "'" ElseIf $sInStr = "'" Then $sInStr = "" EndIf Case Else If $sInStr = "" And StringMid($sInput, $i, 4) = "Then" Then Local $vResult = Execute(StringMid($sInput, 3, $i - 4)) If @error And $vResult = "" Then _Console_Write("Invalid IF statement. Unable to execute statement code." & @CRLF) ContinueLoop 2 EndIf If $vResult Then $sInput = StringTrimLeft($sInput, $i + 4) $i = -1 $vResult = 0 ExitLoop ; We let the interpreter deal with it :) Else _Console_Write("If test returned FALSE." & @CRLF) $sInStr = 0 $vResult = 0 ContinueLoop 2 EndIf EndIf EndSwitch Next $sInStr = 0 If $i <> -1 Then _Console_Write("IF has no matching THEN." & @CRLF) ContinueLoop EndIf EndIf EndSwitch If (StringLeft($sInput, 1) = "$") And _Au3Int_GetOp($sInput, "=") Then Local $a = StringRegExp($sInput, "\$(\w+(?:\[.+\])*)\s*([\+\-/\*&^=]?=)\s*(.*)", 3) If @error Then _Console_Write("Error parsing variable operation." & @CRLF) ContinueLoop EndIf $a[2] = _Au3Int_NQReplace($a[2], "@error", $error) $a[2] = _Au3Int_NQReplace($a[2], "@extended", $extended) $a[2] = Execute($a[2]) $error = @error $extended = @extended If @error And $a[2] = "" Then _Console_Write("Error parsing variable statement. Error executing data." & @CRLF) ContinueLoop EndIf DllCall($hKERNEL32, "bool", "GetConsoleScreenBufferInfo", _ "handle", $hConsoleOutput, _ "ptr", DllStructGetPtr($tScreenBufferInfo)) If DllStructGetData($tScreenBufferInfo, "CursorPositionX") > 1 Then _Console_Write(@CRLF) If StringInStr($a[0], "[") Then Local $asInd = StringTrimLeft($a[0], StringInStr($a[0], "[") - 1) ; array dimensions, ie [1][2][3] Local $sFinal = "", $sTemp For $j = 1 To StringLen($asInd) $sTemp = _Au3Int_ArrayParse($asInd, $j) $j = @extended $sTemp = Execute($sTemp) $sFinal &= "[" & $sTemp & "]" If @error And $sTemp = "" Then _Console_Write("Error in array statement. '" & $sTemp & "' does not evaluate to a valid number." & @CRLF) ContinueLoop 2 EndIf Next Local $sVar = StringLeft($a[0], StringInStr($a[0], "[") - 1) ; var without leading $ $asInd = StringMid($sFinal, 2, StringLen($sFinal) - 2) ; strip outside [ ] $asInd = StringSplit($asInd, "][", 1) $sFinal = 0 $sTemp = 0 If Not IsDeclared($sVar) Then _Console_Write("Error in array statement. Variable '" & $sVar & "' is not declared." & @CRLF) ContinueLoop EndIf $aVar = Eval($sVar) If Not IsArray($aVar) Then _Console_Write("Error in array statement. Variable '" & $sVar & "' is not an array." & @CRLF) ContinueLoop ElseIf UBound($aVar, 0) <> $asInd[0] Then _Console_Write("Error in array statement. '" & $sVar & "' has " & UBound($aVar, 0) & " dimensions, attempted to access with " & $asInd[0] & "." & @CRLF) ContinueLoop EndIf For $i = 1 To $asInd[0] If Not StringIsInt($asInd[$i]) Then _Console_Write("Error in array statement. Dimension " & $i & " ('" & $asInd[$i] & "') is not a number." & @CRLF) ContinueLoop 2 EndIf $asInd[$i] = Int($asInd[$i]) If $asInd[$i] < 0 Then _Console_Write("Error in array statement. Dimension " & $i & " ('" & $asInd[$i] & "') is less than zero." & @CRLF) ContinueLoop 2 EndIf If $asInd[$i] > UBound($aVar, $i) - 1 Then _Console_Write("Error in array statement. Dimension " & $i & " ('" & $asInd[$i] & "') is outside the bounds of the array dimension ('" & (UBound($aVar, $i) - 1) & "')." & @CRLF) ContinueLoop 2 EndIf Next Local $vVal = _Au3Int_EvalArray($aVar, $asInd) If @error Then ContinueLoop Switch $a[1] Case "=" _Console_Write("Obscure instruction." & @CRLF) While 1 _Console_Write("Do you want to re-assign '" & $a[0] & "'? y/n ") $sInput = _Au3Int_Read() If $sInput = "y" Then $vVal = $a[2] ExitLoop ElseIf $sInput = "n" Then If $vVal = $a[2] Then _Console_Write("= > True" & @CRLF) Else _Console_Write("= > False" & @CRLF) EndIf ContinueLoop 2 ElseIf $sInput = "exit" Then Exit ElseIf $sInput = "end" Then ContinueLoop 2 EndIf WEnd Case "==" If $vVal == $a[2] Then _Console_Write("=> True" & @CRLF) Else _Console_Write("=> False" & @CRLF) EndIf ContinueLoop Case ">=" If $vVal >= $a[2] Then _Console_Write("=> True" & @CRLF) Else _Console_Write("=> False" & @CRLF) EndIf ContinueLoop Case "<=" If $vVal <= $a[2] Then _Console_Write("=> True" & @CRLF) Else _Console_Write("=> False" & @CRLF) EndIf ContinueLoop Case "*=" $vVal *= $a[2] Case "/=" $vVal /= $a[2] Case "-=" $vVal -= $a[2] Case "+=" $vVal += $a[2] Case "&=" $vVal &= $a[2] EndSwitch ; Assign the new value _Au3Int_AssignArray($aVar, $asInd, $vVal) If @error Then ContinueLoop Assign($sVar, $aVar) _Au3Int_PrintVar($vVal, "", $iPrint) $a = 0 $sVar = 0 $aVar = 0 $vVal = 0 $asInd = 0 ContinueLoop EndIf If Not IsDeclared($a[0]) Then If $a[1] <> "=" Then _Console_Write("Variable: '" & $a[0] & "' does not exist." & @CRLF) ContinueLoop EndIf If Assign($a[0], $a[2], 1) = 0 Then _ _Console_Write("Error parsing variable declaration. Error assigning variable." & @CRLF) _Au3Int_PrintVar(Eval($a[0]), "", $iPrint) $a = 0 $sCode &= $s__InternalInputCopy & @CRLF ContinueLoop EndIf Switch $a[1] Case "=" _Console_Write("Obscure instruction." & @CRLF) While 1 _Console_Write("Do you want to re-assign '" & $a[0] & "'? y/n ") $sInput = StringStripWS(_Au3Int_Read(), 3) If $sInput = "y" Then If Assign($a[0], $a[2], 1) = 0 Then _ _Console_Write("Error parsing variable declaration. Error assigning variable." & @CRLF) _Au3Int_PrintVar(Eval($a[0]), "", $iPrint) $sCode &= $s__InternalInputCopy & @CRLF $a = 0 ContinueLoop 2 ElseIf $sInput = "n" Then If Eval($a[0]) = $a[2] Then _Console_Write("=> True" & @CRLF) Else _Console_Write("=> False" & @CRLF) EndIf $sCode &= $s__InternalInputCopy & @CRLF $a = 0 ContinueLoop 2 ElseIf $sInput = "exit" Then Exit ElseIf $sInput = "end" Then $a = 0 ContinueLoop 2 EndIf WEnd Case "+=", "-=", "*=", "/=", "&=" If $a[1] = "&=" Then Assign($a[0], Eval($a[0]) & $a[2], 1) Else Assign($a[0], Execute(Eval($a[0]) & StringLeft($a[1], 1) & $a[2]), 1) EndIf _Au3Int_PrintVar(Eval($a[0]), "", $iPrint) $sCode &= $s__InternalInputCopy & @CRLF $a = 0 ContinueLoop Case "==" If Eval($a[0]) = $a[2] Then _Console_Write("= > True" & @CRLF) Else _Console_Write("= > False" & @CRLF) EndIf $sCode &= $s__InternalInputCopy & @CRLF $a = 0 ContinueLoop EndSwitch EndIf ; Execute $sInput = _Au3Int_NQReplace($sInput, "@error", $error) $sInput = _Au3Int_NQReplace($sInput, "@extended", $extended) $sInput = Execute($sInput) $error = @error $extended = @extended DllCall($hKERNEL32, "bool", "GetConsoleScreenBufferInfo", _ "handle", $hConsoleOutput, _ "ptr", DllStructGetPtr($tScreenBufferInfo)) If DllStructGetData($tScreenBufferInfo, "CursorPositionX") > 1 Then _Console_Write(@CRLF) If $error And $sInput = "" Then _Console_Write("= > Error: ") Local $iPid = Run(FileGetShortName(@AutoItExe) & " /ErrorStdOut /AutoIt3ExecuteLine """ & _ StringReplace($s__InternalInputCopy, '"', '""') & """", @ScriptDir, Default, 8) Local $sText = "" While 1 $sText &= StdoutRead($iPid) If @error Then ExitLoop Sleep(10) WEnd $sText = StringMid($sText, StringInStr($sText, "==>") + 4) If $sText = "" Then $sText = "Unable to retrieve extended error information." $sText = StringStripWS($sText, 3) If StringRight($sText, 1) = ":" Then $sText = StringTrimRight($sText, 1) _Console_Write(StringStripWS($sText, 3) & @CRLF) $sText = 0 $iPid = 0 Else _Au3Int_PrintVar($sInput, "", $iPrint) $sCode &= $s__InternalInputCopy & @CRLF EndIf EndSwitch WEnd Return False EndFunc ;==>_Au3Int_Proc Func _Console_FlushInputBuffer() Local $aResult = DllCall($hKERNEL32, "bool", "FlushConsoleInputBuffer", "handle", $hConsoleInput) If @error Then Return SetError(@error, @extended, False) Return $aResult[0] <> 0 EndFunc ;==>_Console_FlushInputBuffer Func _Au3Int_Read() Local $sRet = "", $sTemp While 1 $sTemp = _Console_ReadConsole($hConsoleInput, 1) If $sTemp = @CR Then ExitLoop $sRet &= $sTemp WEnd Return $sRet EndFunc ;==>_Au3Int_Read Func _Console_ReadConsole($hConsoleInput, $nNumberOfCharsToRead) Local $tBuffer, $aResult $tBuffer = DllStructCreate("char[" & ($nNumberOfCharsToRead + 1) & "]") $aResult = DllCall($hKERNEL32, "bool", "ReadConsoleA", _ "handle", $hConsoleInput, _ "ptr", DllStructGetPtr($tBuffer), _ "dword", $nNumberOfCharsToRead, _ "dword*", 0, _ "ptr", 0) If @error Or (Not $aResult[0]) Then Return SetError(@error, @extended, "") Return SetExtended($aResult[4], DllStructGetData($tBuffer, 1)) EndFunc ;==>_Console_ReadConsole Now another question I had regarding what Pallindrome had stated above about storing variables within the registry. Does this work the same way as it does for cmd? HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Control\Session Manager\Environment Would we store them in a new key and would this be a temporary thing that cleans it self each time the script exits, or perhaps a switch for creating global variables that maintain even after exit? I have also been doing research on creating ini files to store variables, but I just do not like this idea as much. I see how this will work. I am going to post everything that I am learning so that anyone reading this if they want to or see me doing something wrong can guide me in a more sufficient manner. So for my testing purposes when working with an ini file I basically took arguments from the command line passed to the au3 script and stored their values in the ini. Then inside the same script when I ran into my make shift echo command it stored the command line raw whole string into a variable which was parsed with StringSplit when it ran into a variable which was defined like it is in Autoit $Var and then split by a white space. It would read from the ini file its corresponding value. This to me is my understanding of using the ini. Am I correct in this approach? Again I thank those helping me very much your guidance is very much appreciated. "You're not smart enough for me to open my inbox, so stop sending me mail." 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