prismite Posted March 27, 2014 Share Posted March 27, 2014 Hi folks. I've been using AutoIT for all of my past jobs but all the work I've done has been simple or at least easy to figure out by going off of the wellspring of knowledge on the internet. However, I am frustrated with my current challenges and decided to post for direct support. I am no where near the level of complexity as some of you can get so forgive my (hopefully) feeble challenges here. 1. I want a user to be able to get prompted a box where they can paste in a 14 character string. The string is always the same format, so thats something. However, I then want a function that will parse out that data into segments, skipping the 5th and 10th character. For example, if the user keys in 12345678901234, then the function will snip out "1234", "6789", "1234". I imagine thats an array function, but I cant seem to find specifics on it to be able to do this exactly. 2. I need to be able to SSH into a remote server. I've been doing a LOT of reading on here about SSH and all the posts I've read have been 2006-ish or such and I'm hoping that things have gotten easier since then. I've got plink (as it was recommened in numerous threads) but when it runs it's just a blank screen, regardless of how I format my command. Does anyone have a streamlined code for this anywhere? Link to comment Share on other sites More sharing options...
czardas Posted March 27, 2014 Share Posted March 27, 2014 Is this any use? #include <Array.au3> Local $sString = "12345678901234" Local $aRegExp = StringRegExp($sString, "(.{1,4})(?:.)?", 3) _ArrayDisplay($aRegExp) operator64 ArrayWorkshop Link to comment Share on other sites More sharing options...
mikell Posted March 27, 2014 Share Posted March 27, 2014 1..... a 14 character string. The string is always the same format, so thats something. So isn't this enough ? StringRegExp($sString, "(.{4}).?", 3) Link to comment Share on other sites More sharing options...
czardas Posted March 27, 2014 Share Posted March 27, 2014 (edited) Hi mikell, yeah - I notice it doesn't capture anything outside the group. I put {1,4} in there on purpose, in case the string size changes in the future: so it will keep on going, skipping past every 5th character. Edited March 27, 2014 by czardas operator64 ArrayWorkshop Link to comment Share on other sites More sharing options...
mikell Posted March 27, 2014 Share Posted March 27, 2014 Hmm it looks like you were first actually thinking about a replace #include <Array.au3> Local $sString = "12345678901234" Local $aRegExp = StringRegExpReplace($sString, "(.{1,4})(?:.)?", "$1") msgbox(0,"", $aRegExp) Link to comment Share on other sites More sharing options...
czardas Posted March 27, 2014 Share Posted March 27, 2014 (edited) Thanks mikell for trying to cover my mistakes. The truth is I'm still getting used to the awesome possibilities of regexp and it was really a quick solution. Learning all the time around here. Edited March 27, 2014 by czardas operator64 ArrayWorkshop Link to comment Share on other sites More sharing options...
iamtheky Posted March 27, 2014 Share Posted March 27, 2014 (edited) $string = "12345678901234" $aString = stringsplit($string , "") msgbox (0, '' ,'"' & $aString[1] & $aString [2] & $aString[3] & $aString[4] & '"' & ',' & _ '"' & $aString[6] & $aString [7] & $aString[8] & $aString[9] & '"' & ',' & _ '"' & $aString[11] & $aString [12] & $aString[13] & $aString[14] & '"') ..i., regexp 2) and for ssh does plink accept arguments like putty? Local $iPID = Run('"C:\Program Files (x86)\Putty\putty.exe" -ssh root@HOST:22 -pw PASSWORD') *knew i got that comment off the forums somewhere: Edited March 27, 2014 by boththose ,-. .--. ________ .-. .-. ,---. ,-. .-. .-. .-. |(| / /\ \ |\ /| |__ __||| | | || .-' | |/ / \ \_/ )/ (_) / /__\ \ |(\ / | )| | | `-' | | `-. | | / __ \ (_) | | | __ | (_)\/ | (_) | | .-. | | .-' | | \ |__| ) ( | | | | |)| | \ / | | | | | |)| | `--. | |) \ | | `-' |_| (_) | |\/| | `-' /( (_)/( __.' |((_)-' /(_| '-' '-' (__) (__) (_) (__) Link to comment Share on other sites More sharing options...
prismite Posted March 28, 2014 Author Share Posted March 28, 2014 I really appreciate everyone's help. Even though I'm not where I want to be just yet, all of your suggestions are teaching me more as I try to implement them. Firstly @ Boththose: The $string code that you suggested returns an error saying there are too many Dimensions or such. HOWEVER, your ssh suggestion was EXACTLY what I needed. Thanks a BUNCH! As for the initial string problem, Mikell, your code yeilds an array box that says "16" in it. Czardas, your code yeilds no output at all, so I tried a few methods but I can only get a msgbox with the output of "16" as well. Geez. I feel retarded. Let me elaborate. The script is to convert MAC Addresses into a more common format. When copying addresses straight out of a CMTS a mac address is typically formatted like this: "0000.1111.2222" (14 char). I need the format to be changed to "00:00:11:11:22:22" I thought something as simple like this (taken off the main AutoIT site) would be the key, modified for my own purposes of course: #include <StringConstants.au3> #include <MsgBoxConstants.au3> Example() Func Example() Local $sText = "This\nline\ncontains\nC-style breaks." ; Define a variable with a string of text. Local $aArray = StringSplit($sText, '\n', $STR_ENTIRESPLIT) ; Pass the variable to StringSplit and using the delimeter "\n". ; Note that flag paramter is set to $STR_ENTIRESPLIT (1) as it would split at \ or n otherwise. #cs The array returned will contain the following values: $aArray[1] = "This" $aArray[2] = "line" ... $aArray[4] = "C-style breaks." #ce For $i = 1 To $aArray[0] ; Loop through the array returned by StringSplit to display the individual values. MsgBox($MB_SYSTEMMODAL, "", "$aArray[" & $i & "] - " & $aArray[$i]) Next EndFunc ;==>Example But the program doesn't like these "include statements" or the "STR_ENTIRESPLIT" option. Link to comment Share on other sites More sharing options...
czardas Posted March 28, 2014 Share Posted March 28, 2014 (edited) I can't imagine how you get nothing. You should get an array displayed as I do. To access the elements within the array you need to append the number of the element, between square brackets, as shown below. I have no idea where the number 16 comes from. If your AutoIt version is older than the current version, then it will not recognize MsgBoxConstants.au3. You should check you have the latest stable release version of AutoIt. The following code should work on both the current and previous AutoIt versions. ; #include <Array.au3> ; For _ArrayDisplay function Local $sString = "123456789012348" Local $aRegExp = StringRegExp($sString, "(.{1,4}).?", 3) ; OR ==> StringRegExp($sString, "(.{4}).?", 3) MsgBox(0, "Array Values", $aRegExp[0] & @CRLF & $aRegExp[1] & @CRLF & $aRegExp[2]) ; Does not require MsgBoxConstants.au3 _ArrayDisplay($aRegExp) ; This should display an array ; Run the code as is and see if anything happens. Edited March 28, 2014 by czardas operator64 ArrayWorkshop Link to comment Share on other sites More sharing options...
iamtheky Posted March 28, 2014 Share Posted March 28, 2014 (edited) if you copy my code exactly as pasted it throws an error? or did you decide to enter your own string, of less than 14 characters, and are learning about accessing elements that dont exist? if you do an _arraydisplay($sArray) after the stringsplit can you see all the characters and their place in the array? Edited March 28, 2014 by boththose ,-. .--. ________ .-. .-. ,---. ,-. .-. .-. .-. |(| / /\ \ |\ /| |__ __||| | | || .-' | |/ / \ \_/ )/ (_) / /__\ \ |(\ / | )| | | `-' | | `-. | | / __ \ (_) | | | __ | (_)\/ | (_) | | .-. | | .-' | | \ |__| ) ( | | | | |)| | \ / | | | | | |)| | `--. | |) \ | | `-' |_| (_) | |\/| | `-' /( (_)/( __.' |((_)-' /(_| '-' '-' (__) (__) (_) (__) Link to comment Share on other sites More sharing options...
prismite Posted March 28, 2014 Author Share Posted March 28, 2014 Hmm. Interesting. I'm not sure what I fat-fingered initially, but now the code is giving me the anticipated result of 1234, 6789 and 1234. Using a bastardized form of your code, I was able to hit my final mark! YAY! Func button5 () $CPEMAC = GuiCTRLRead ($Input1) Local $aRegExp = StringRegExp($CPEMAC, "(.{1,4}).?", 3) ; OR ==> StringRegExp($sString, "(.{4}).?", 3) $Q1 = $aRegExp[0] $Q2 = $aRegExp[1] $Q3 = $aRegExp[2] Local $aRegExp2 = StringRegExp($Q1, "(.{1,2})?", 3) Local $aRegExp3 = StringRegExp($Q2, "(.{1,2})?", 3) Local $aRegExp4 = StringRegExp($Q3, "(.{1,2})?", 3) MsgBox(0, "Converted MAC", $aRegExp2[0] & ':' & $aRegExp2[1] & ':' & $aRegExp3[0] & ':' & $aRegExp3[1] & ':' & $aRegExp4[0] & ':' & $aRegExp4[1]) EndFunc So, essentially I'm taking the 14 digit user entry and parsing out the 5th and 10th character, and segmenting the other 12 letters into groups of 4 using your code. Then, through some trial and error, I figured out to assign each of those groups thier own variable so that a similar parsing can happen, thus reducing those 4 characters into 2 groups of 2 each. Then finally, slam it all together in the format I needed. I'm sure there was an easier way to get here (lol) but the trip was filled with a great deal of personal growth, so Thanks a HEAP all! Hmm... now to make the output on the msgbox be copyable... Link to comment Share on other sites More sharing options...
iamtheky Posted March 28, 2014 Share Posted March 28, 2014 Look at ClipPut, so then all you have to do is paste what is on your clipboard. ,-. .--. ________ .-. .-. ,---. ,-. .-. .-. .-. |(| / /\ \ |\ /| |__ __||| | | || .-' | |/ / \ \_/ )/ (_) / /__\ \ |(\ / | )| | | `-' | | `-. | | / __ \ (_) | | | __ | (_)\/ | (_) | | .-. | | .-' | | \ |__| ) ( | | | | |)| | \ / | | | | | |)| | `--. | |) \ | | `-' |_| (_) | |\/| | `-' /( (_)/( __.' |((_)-' /(_| '-' '-' (__) (__) (_) (__) Link to comment Share on other sites More sharing options...
czardas Posted March 28, 2014 Share Posted March 28, 2014 (edited) Hmm. Interesting. I'm not sure what I fat-fingered initially, but now the code is giving me the anticipated result of 1234, 6789 and 1234. Using a bastardized form of your code, I was able to hit my final mark! YAY! Func button5 () $CPEMAC = GuiCTRLRead ($Input1) Local $aRegExp = StringRegExp($CPEMAC, "(.{1,4}).?", 3) ; OR ==> StringRegExp($sString, "(.{4}).?", 3) $Q1 = $aRegExp[0] $Q2 = $aRegExp[1] $Q3 = $aRegExp[2] Local $aRegExp2 = StringRegExp($Q1, "(.{1,2})?", 3) Local $aRegExp3 = StringRegExp($Q2, "(.{1,2})?", 3) Local $aRegExp4 = StringRegExp($Q3, "(.{1,2})?", 3) MsgBox(0, "Converted MAC", $aRegExp2[0] & ':' & $aRegExp2[1] & ':' & $aRegExp3[0] & ':' & $aRegExp3[1] & ':' & $aRegExp4[0] & ':' & $aRegExp4[1]) EndFunc So, essentially I'm taking the 14 digit user entry and parsing out the 5th and 10th character, and segmenting the other 12 letters into groups of 4 using your code. Then, through some trial and error, I figured out to assign each of those groups thier own variable so that a similar parsing can happen, thus reducing those 4 characters into 2 groups of 2 each. Then finally, slam it all together in the format I needed. I'm sure there was an easier way to get here (lol) but the trip was filled with a great deal of personal growth, so Thanks a HEAP all! Hmm... now to make the output on the msgbox be copyable... Your function is missing a return value. The following code does what you want with one regular expression. I imagine it can also be done with fewer lines of code, but read the comments to get a better idea of what is going on. ; Global $sString = "12345678901234" Global $sMAC = _Convert() ; Declare and assign a variable in a single line of code MsgBox(0, "Converted MAC", $sMAC) ; Display the results Func _Convert() Local $aRegExp = StringRegExp($sString, "(.{2})(.{2}).?", 3) Local $sMAC = "" ; Start with an empty string to concatenate ; Loop through the array to get the values of each element For $i = 0 To UBound($aRegExp) -1 ; Avoids going out of bounds $sMAC &= $aRegExp[$i] & ':' ; Concatenation Next $sMAC = StringTrimRight($sMAC, 1) ; Get rid of unwanted characters Return $sMAC ; Return the converted string EndFunc : So your function could be written something like this: : Func button5 () Local $CPEMAC = GuiCTRLRead ($Input1) Local $aRegExp = StringRegExp($CPEMAC, "(.{2})(.{2}).?", 3) Local $sMAC = "" For $i = 0 To UBound($aRegExp) -1 $sMAC &= $aRegExp[$i] & ':' Next $sMAC = StringTrimRight($sMAC, 1) Return $sMAC EndFunc ; You can also use ClipPut() if you want the return value on the clipboard, as boththose suggested. Do it after calling the function, rather than from inside the function - unless you have reason to do otherwise. Edited March 28, 2014 by czardas operator64 ArrayWorkshop Link to comment Share on other sites More sharing options...
prismite Posted March 28, 2014 Author Share Posted March 28, 2014 EXCELLENT! ClipPut was (once again) exactly what i needed for that. I see the changes you made and I think I will try and incorporate that so that I have the experience of doing it for later, should a similar need arise. Still, much obliged! I still have so much work ahead of to accomplish things I dont even know if they are possible. Before I post, however, I will make a conscious effort to learn. Thanks againg everyone! czardas 1 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