In this FREE six-day email course, you'll learn from Janis Griffin, Database Performance Evangelist. She'll teach 12 steps that you can use to optimize your queries as much as possible and see measurable results in your work. Get started today!
# $language = "VBScript" # $interface = "1.0" ' ASSUMPTION: file being 'tailed' contains information ' similar to: ' Jan 5 18:26:13 device01 9927: Jan 5 18:26:12: %LINK-3-UPDOWN: Interface POS5/2, changed state to down ' Jan 5 18:26:47 device02 6332: Jan 5 18:26:46.243: %LINK-3-UPDOWN: Interface GigabitEthernet3/1, changed state to down ' Jan 5 18:28:40 device01 9937: Jan 5 18:28:39: %LINK-3-UPDOWN: Interface POS5/2, changed state to down Dim g_fso, g_shell Set g_fso = CreateObject("Scripting.FileSystemObject") Set g_shell = CreateObject("WScript.Shell") Const ForReading = 1 Const ForWriting = 2 Const ForAppending = 8 Dim g_szLogFile, g_szFirstLogFilePath, objTab g_szLogFile = GetMyDocumentsFolder & "\Command#__NUM___Results.txt" Set objTab = crt.GetScriptTab Dim g_vCommands(100) g_vCommands(0) = "show ip int brief" g_vCommands(1) = "show cdp neighbor" g_vCommands(2) = "show run" g_vCommands(3) = "show ip ospf" g_vCommands(4) = "show ip bgp" g_vCommands(5) = "show ip ospf neighbor" g_vCommands(6) = "show int fas 0/0" g_vCommands(7) = "show ldp neighbor" g_vCommands(8) = "show run int tunn 0" g_vCommands(9) = "show run int fas 0/1" ' . ' . ' . Sub Main() 	 ' Make sure that we are running in Synchronous mode so ' that when WaitForStrings() finds something, we can ' capture the current line without risk of it already ' having flown by on the screen. This slows things down ' a bit, but provides insurance against errors due to ' SecureCRT and the script running asynchronously. crt.Screen.Synchronous = true ' Start tailing a file... crt.Screen.Send "tail tailfile.txt" & vbcr ' Example #1: Uses WaitForString to look for just the text ' we care about. Once the text is found, the ' line on which the text was located is captured ' and a piece of information is parsed using the ' Split() builtin VBScript method. CaptureJustTheLinesWeCareAbout ' Example #2: Uses WaitForString to detect when every new line ' arrives from the remote. Each line of text is ' captured, and the Instr() builtin VBScript ' function is used to detect the presence of the ' specific text we care about. Iff it is present, ' the Split() builtin VBScript method is used to ' parse out the relevant piece of information. ' ' The benefit of this method over ' CaptureJustTheLinesWeCareAbout is that we ' can retrieve information from the line if ' the text we care about comes prior to the ' relevant piece of information that we would ' like to display as part of our notification. ' ' To enable this example, comment out the statement ' on line 29 and uncomment the line below: ' CaptureAllLinesAndSearchForTextWeCareAbout End Sub '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Sub CaptureJustTheLinesWeCareAbout() MsgBox "Capturing just the lines we care about" do ' Look for specific output crt.Screen.WaitForString "changed state to down" ' Once specific output is found, capture the line ' of text on which the "changed to state down" string ' was located. szCurrentLine = crt.Screen.Get(crt.Screen.CurrentRow, _ 0, _ crt.Screen.CurrentRow, _ crt.Screen.Columns) ' Trim off any leading or training spaces szCurrentLine = Trim(szCurrentLine) ' Use the Split() method (builtin VBScript method) ' to get at the component we care about (deviceID) vElements = Split(szCurrentLine, " ") for each x in vElements 'document.write(x & "<br />") next MsgBox "Device """ & vElements(3) & """ just went down." 	LogOutputOfSpecificCommandUseReadString 'MsgBox "Device """ & vElements(0) & vElements(1) & vElements(2) & vElements(3) & """ just went down." 'MsgBox "Device """ & vElements(0) & vElements(1) & vElements(2) & vElements(3) & "is " vElements(6)" Loop End Sub '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Sub LogOutputOfSpecificCommandUseReadString() ' Instruct WaitForString and ReadString to ignore escape sequences when ' detecting and capturing data received from the remote (this doesn't ' affect the way the data is displayed to the screen, only how it is handled ' by the WaitForString, WaitForStrings, and ReadString methods associated ' with the Screen object. objTab.Screen.IgnoreEscape = True objTab.Screen.Synchronous = True If Not objTab.Session.Connected then crt.Dialog.MessageBox _ "Not Connected. Please connect before running this script." exit sub end if Dim szCommand, szPrompt, nRow, szLogFileName, nIndex ' If this script is run as a login script, there will likely be data ' arriving from the remote system. This is one way of detecting when it's ' safe to start sending data. If this script isn't being run as a login ' script, then the worst it will do is seemingly pause for one second ' before determining what the prompt is. ' If you plan on supplying login information by waiting for username and ' password prompts within this script, do so right before this do..loop. Do bCursorMoved = objTab.Screen.WaitForCursor(1) Loop until bCursorMoved = False ' Once the cursor has stopped moving for about a second, we'll ' assume it's safe to start interacting with the remote system. ' Get the shell prompt so that we can know what to look for when ' determining if the command is completed. Won't work if the prompt ' is dynamic (e.g. changes according to current working folder, etc) nRow = objTab.Screen.CurrentRow szPrompt = objTab.screen.Get(nRow, _ 0, _ nRow, _ objTab.Screen.CurrentColumn - 1) szPrompt = Trim(szPrompt) Dim szLogFile nIndex = 0 Do szCommand = Trim(g_vCommands(nIndex)) ' If the command is empty, then we should be done issuing commands ' (there's nothing else in our command array g_vCommands) if szCommand = "" then Exit Do ' Set up the log file for this specific command szLogFile = Replace(g_szLogFile, "__NUM__", NN(nIndex + 1, 2)) ' Store the path for our first log file for later use (see end of this ' function... if g_szFirstLogFilePath = "" then g_szFirstLogFilePath = szLogFile ' Send the command text to the remote objTab.Screen.Send szCommand & vbcr ' Wait for the command to be echo'd back to us. objTab.Screen.WaitForString vbcr, 1 objTab.Screen.WaitForString vblf, 1 Dim szResult ' Use the ReadString() method to get the text displayed while the ' command was runnning. Note that the ReadString usage shown below ' is not documented properly in SecureCRT help files included in ' SecureCRT versions prior to 6.0 Official. Note also that the ' ReadString() method captures escape sequences sent from the remote ' machine as well as displayed text. As mentioned earlier in comments ' above, if you want to suppress escape sequences from being captured, ' set the Screen.IgnoreEscape property = True. szResult = objTab.Screen.ReadString(szPrompt) Dim objFile Set objFile = g_fso.OpenTextFile(szLogFile, ForWriting, True) ' If you don't want the command logged along with the results, comment ' out the very next line objFile.WriteLine "Results of command: " & szCommand ' Write out the results of the command to our log file objFile.WriteLine szResult ' Close the log file objFile.Close ' Move on to the next command in our command array g_vCommands nIndex = nIndex + 1 Loop ' Once we're complete, let's bring up Windows Explorer with the first of ' the log files selected. g_shell.Run "explorer /e,/select,""" & g_szFirstLogFilePath & """" End Sub '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Function GetMyDocumentsFolder() Dim myShell Set myShell = CreateObject("WScript.Shell") GetMyDocumentsFolder = myShell.SpecialFolders("MyDocuments") End Function '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Function NN(nNumber, nDesiredDigits) ' Normalizes a single digit number to have nDesiredDigits 0s in front of it Dim nIndex, nOffbyDigits, szResult nOffbyDigits = nDesiredDigits - len(nNumber) szResult = nNumber For nIndex = 1 to nOffByDigits szResult = "0" & szResult Next NN = szResult End Function