|
|
|||||||
Hey guys glenn is busy I guess. can anyone one of you gurus help me. I do not know how to do thebelow I have some of it but just need help or ag ood reference thanks guys robert Code: Do For Each $Element In $Input $count = $count + 1 Shell "cmd.exe /c ping " + $Element + " -n 1 >> SurpressIT.txt" IF (@ERROR = 0) ? $Element Endif If (@ERROR = 0) remove this element from input array now. Then reindex Input array repeat loop because input array is not empty Next While ($input array not empty) |
||||||||
|
|
|||||||
Just to be clear. You want to loop through a list of hostnames and simply remove the ones that can't be pinged ? Or do you want to keep looping until ALL hostnames in the list get pinged (trying to figure-out if you really need a loop within a loop). |
||||||||
|
|
|||||||
Here is an example which works if you don't have the space character in your data: Code: Break ON $Array=Split("06 02 20 11") CLS "Hit enter to start" GetS $ CLS While Join($Array)<>"" AT(1,5) " TIME: "+@TIME $MISSING="" $i=0 While $i<=UBound($Array ) If $Array[$i]=Split(@TIME,":")[2] $FOUND=$FOUND+$ARRAY[$i]+" " ; *** This is the magic where we delete the entry*** $Array[$i]="" $Array=split(Trim(Join(Split(Join($Array)," ")))) ; *** End of magic *** Else $MISSING=$MISSING+$ARRAY[$i]+" " $i=$i+1 EndIf Loop AT(3,5) " Hit the following seconds: "+$FOUND+" " AT(5,5) "Missing the following seconds: "+$MISSING+" " Sleep (1) ; Slow things down a bit Loop @CRLF+"All found..." |
||||||||
|
|
|||||||
hey shaun thanks yes what it is I am building a program where it bounces certain servers names and the instead of me opening up 20 windows i can watch them come up by name as they come up the program would loop the ones that remain in the array until all are taken out of array and thus are successfully up it is a simple prgram. It is almost done but what it is is I reboot servers every so often and I cant fgure out how to keep looping pinging the machiness that are not up yet and then once successful ping display it on screen and keep trying the others until they are all displayed on screen only once. I do not want to wait till all are up then display array. I want them to display as they are successful then keep trying and then once next server is up display that until the exact number of server inputted and rebooted is displayed real-time back to me..I just dont know how to remove an array element from an array in Kix I know in javascript I can do it but am trying to use kixtart then after i get it want to compile it to ane exe using the kixtart compiler...thanks man I do appreciate you guys help will post it here when i am done with it... Richard H. thank you I will try to read and understand you rendition of my programs tahnks for your help...will post my entire program when I am done for others to see thank you kindly! robert(itdaddy) |
||||||||
|
|
|||||||
Ok understood. I'm just leaving work and will try to take a stab at some code on the train-ride home. If nobody post a solution until then, will post something later tonight ... sounds like a neat project. |
||||||||
|
|
|||||||
k, here's a variation on that first theme ... adding unpingables to a delimited string, than splitting back into the array and looping ... Code: Break On $Array = Split("127.0.0.1 127.0.0.1 poop1 127.0.0.1 poop2 poop1") ?"Scanning..."? While UBound($Array) > 0 $DownList = "" For Each $Hostname in $Array If $Hostname SHELL 'CMD /C PING $Hostname -n 2 | findstr /i "TTL=" >NUL 2>NUL' If @ERROR = 0 ?"$Hostname: RUNNING" Else ?"$Hostname: DOWN" $DownList = $DownList + $Hostname + "|" Endif Endif Next $Array = Split($DownList,"|") Loop ??">>>Done!" Exit 0 |
||||||||
|
|
|||||||
hey shawn thanks will try it monday at work I am not familar with split() but looks like it makes a new array? I think..but ran thru in my head and it looks like it might work super...will post entire script when..I thought of it after having to do this often and hated looking at all the ping replies in multiple DOS windows..I said to self...self it would be nice to have a script do this and me just watch names appear when they were up..hee hee hence bw.exe (bounce watch program) bounce the server watch em come up hee hee. thanks for your help you the man! |
||||||||
|
|
|||||||
Shawn it will work great but what I did was remvoe the 'Down' output so it only displays successful pings...great script... but was wondering how does that Code: $Array = Split($DownList,"|") Code: $DownList = $DownList + $Hostname + "|" so it concat a pipe in the array $DownList and then makes a new $Array I can see that from the $DownList but how does spit() work can you explain how that code works to make it separate the down PCs and then makes the new array? I just cant see how it does it..thanks Robert;) |
||||||||
|
|
|||||||
You're taking an array of hosts, and while the array isn't empty, you are doing: 1. Create a new empty string of downed hosts. 2. For each host in the array 2.a. ping the host 2.b. If you get a reply, state the host is running. 2.c. If not, state the host is down and add the host name to the end of the string of downed hosts along with a delimiter. 3. Create a new array by splitting the downed hosts string on the given delimiter. Repeat if array isn't empty. Does that answer your question? |
||||||||
|
|
|||||||
Hey thanks Brad V sounds good. thanks for your help. Here is my cheesy bounce watch program..not really complicated but it works and does the trick. I am still learning kix and it is fun... Thanks to you all for you help all of you kick arse with kix thank you dudes! Code: ;*************************** ; ; Bounce Watch ; purpose: Restart servers and watch them come ; back up without having to have multiple screens open ; and eliminates busy screens with echo replies. ; hence, bounce and watch them come back up..... ; ;*************************** ;************************** ;Initialized here. ;************************* $count = 0 Break On ;************************ ;Array prompt here. ;************************ ? "Type Input(ex: srv1, srv2): " gets $Array $Array=split($Array,", ") ;************************************* ;Making sure you want to Bounce prompt ;************************************* ? ' ' ? "Do you want to Bounce ? (y/n): " gets $ansr if ($ansr = "y") ? ' ' ? 'Attempting to ping all servers......Please wait.' ? ' ' Endif if ($ansr = "n") goto endit Endif ;************************************ ;this is the shut down engine ;************************************ For Each $Element In $Array Shell "cmd.exe /c shutdown -m \\"+$Element + "-f -r" ;? '$Element - is shutting down.....' Next goto pingIt ;*************************************** ; ping engine watch servers come up ;*************************************** :pingIt ? ' ' ? 'Do they match above?' ? ' ' ?"Scanning.......Please wait for server bounce"? While UBound($Array) > 0 $DownList = "" For Each $Hostname in $Array If $Hostname SHELL 'CMD /C PING $Hostname -n 2 | findstr /i "TTL=" >NUL 2>NUL' If @ERROR = 0 ?"$Hostname: RUNNING" Else ; ?"$Hostname: DOWN" $DownList = $DownList + $Hostname + "|" Endif Endif Next $Array = Split($DownList,"|") Loop ??">>>Done!" goto endit ;*********************************** ; Bounce Watch is closing..... ;*********************************** :endit ? ' ' ? 'Bounce Watch is closing....' ? ' ' ? ' ' ? 'This is - The End' sleep 15 Exit 0 ;********************************* ; End of Bounce Watch ;********************************* |
||||||||
|
|
|||||||
BradV hey I have a question..the Code: While UBound($Array) > 0 statements Loop if the array is 5-0 and zero being an element how does it exit the loop? if the Ubound($array) say is 5 then that means 6 elements? 5-0 is 6 elements how does it exit?? |
||||||||
|
|
|||||||
I was looking at that. I think before you create the array using the split command, you want to delete the last "|". I'm pretty sure when it does the split, it will create an empty last array value. For example, if you have: Code: $DownList = "fred|192.168.0.1|barney|7.210.32.7|" Code: $Array = Split($DownList,"|") Code: $Array[0] = "fred" $Array[1] = "192.168.0.1" $Array[2] = "barney" $Array[3] = "7.210.32.7" $Array[4] = "" Regards, Brad |
||||||||
|
|
|||||||
oh BradV is that what you are saying just my summary below. yuo are saying I need that last element to be bogus right? so it can finish the valid array elements right? it does work perfect though he hee I am a dummy when it reaches 1 > 0 is true 0 > 0 is false then it exits but I just cant get it thru my head what value is the Ubound($Array) > 0? it seems that maybe it just knows that the pipe is the delimiter? it is just funny say the $Array element value was this $Array[0] and it equalled the value of SRV1 to be pinged? would or should it exit the loop cause the array element is zero???? and is false? but for some reason maybe I need the last element to be soomething so it can stop before that point to ping all computernames in the original array? am I making sense? Because the $Array[5] thru say $Array[0] which is 6 elements in the array so when Ubound() hits zero it exits but maybe I need the last element to be bogus so it can finish all computers in the array huh? am I making sense or am I not getting it? because it does work.... |
||||||||
|
|
|||||||
Well, If there is only one computer down, the array (with the code as Shawn presented it) will have two elements. Element 0 will be the name of the down server and element 1 will be null. Since the ubound($array) is equal to 1, the loop will process. I think Shawn included the if $Hostname to eliminate the null value. I would get rid of that if, change the while statement to >= and trim the trailing | before splitting the string: Code: $Downlist = Substr($Downlist, 1, Len($Downlist) - 1) Write yourself a little script to run some tests. Something like: Code: $Downlist="smith|barney|wilma|" $Array=Split($Downlist,"|") "The upper bound of this array is" + Ubound($Array) ? For Each $Hostname in $Array $Hostname ? Next "There should be a blank line above if the downlist ended with a |" ? |
||||||||
|
|
|||||||
Change Shawn's original code from Code: Else ?"$Hostname: DOWN" $DownList = $DownList + $Hostname + "|" Endif Code: Else ?"$Hostname: DOWN" $DownList = $DownList + $Delim + $Hostname $Delim = "|" Endif Glenn |
||||||||
|
|
|||||||
BradV and Glenn you guys make me sick how much you know ahhahaah okay it is a good thing for us newbies ahhaha thanks so much amazing logic and amazing thought process thank you thank you.. Hey what was cool I did a live test yesterday and this is what I found out. Time is essential here. When I ran the program...it went so fast it ran shutdown and then the ping verify..the machines never had time to have their NICs go offline so it didnt work. I had to add a Time primer of 35 seconds to my code (sleep 35) then it allowed them to go offline..I am sure that is only my cheesy/amateurish way of doing it but I dont know right now what else to do...I know GLenn you mention checking to see if service is running. wish I knew what shut off right away on the machines after the shutdown command was run so I wouldnt have to use the time primer of 35 seconds...at the end of program I might have to include a shell command of "psinfo \\computername uptime" and loop it to verify each servers uptime is back to zero days so I know for sure that they bounced. I may for sure include that into this little program..what you think dudes? Maybe just include this as another verify behind scenes as a check to validated they were bounced like and "if days = 0" kind of test to make sure they were bounced.to makes sure no funny stuff happened... Cause all I wanted to do was this: 1. check which servers needed bouncing, hence psinfo \\pcname uptime check. 2. enter their names in prompt (or later have it autofill if 21 days or uptime. 3. ask if you want to reboot each y/n 4. run shutdown command in loop to bounce each server 5. wait 35 seconds so they can crash 6. start checking machines with ping command and repeat until all up only displaying each on the screen as they come up. 7. once done validate their bounce by checking uptime days with psinfo command. 8. mission accomplish go home have a miller genuine draft light! |