SecureCRT也能和Xshell一样批量导入主机

时间:2018-05-12 15:07:45   收藏:0   阅读:2815

在Xshell可以像这样一个文件批量导入主机:

https://blog.netsarang.com/91/importing-csv-formatted-host-information-to-xshell/

在CRT上也可以,格式和Xshell的一样,但前提是需要运行一个自定义脚本:

脚本:https://forums.vandyke.com/showthread.php?p=37089#post37089

操作:https://www.vandyke.com/support/tips/importsessions.html

视频操作:https://youtu.be/f7nMFYhGoiI

简单操作步骤:

技术分享图片

技术分享图片

技术分享图片

 脚本文件内容:

ImportArbitraryDataFromFileToSecureCRTSessions.vbs

技术分享图片
# $language = "VBScript"
# $interface = "1.0"

 ImportArbitraryDataFromFileToSecureCRTSessions.txt   (Designed for use with SecureCRT 7.2 and later)
‘
‘   Last Modified: 23 Feb, 2018      - Warn user if the configuration folder appears to be read-only.      - Fall back to secondary locations in which to attempt to write        the results log file in case the users Documents, Desktop, or
        configuration folder are all read-only or otherwise un-write-able        for the user.
‘
‘   Last Modified: 21 Dec, 2017      - Allow multiple description fields on the same line. All will be        compounded together with each one ending up on a separate line in        the Sessions Description session option.
      - Allow username field to be defaulted in the header line      - Allow folder field to be defaulted in the header line      - Duplicate sessions are now imported with unique time-stamped        names (for each additional duplicate). Earlier versions of this        script would overwrite the first duplicate with any subsequent        duplicates that were found in the data file.      - When displaying the browse dialog, filter now includes both        CSV and TXT file types, to make it easier to find the data file        (less clicking).      - Allow for protocol field to be defaulted, if not present in the        header line.      - Fix error messages relating to invalid header lines so they no        longer indicate Protocol is a required field. If its not present
        the Default Sessions protocol value will be used.
      - Allow header fields to be case-insensitive so that "Description"        and "UserName" work just the same as "description" and "username"
‘
‘   Last Modified: 09 Aug, 2017      - Changed from using CInt to CLng in order to support port        specifications larger than 32768 (max integer supported in VBScript)
‘
‘   Last Modified: 20 Feb, 2017      - Added progress info to status bar      - When a line from the source file has bogus/incomplete data on it,        the script no longer halts operation, but instead, continues the        import process for all remaining legitimate lines, skipping any        lines that dont have sufficient/accurate format.
      - Changed format of summary message shown at end to include header        line so entries that were skipped can be easily copied into a new        document to be imported.      - Toggle the Session Manager automatically so that imported sessions        are more immediately visible in the Session Manager.
‘
‘   Last Modified: 20 Jan, 2015      - Combined TAPI protocol handling (which is no longer        supported for mass import) with Serial protocol        import errors.      - Enhanced example .csv file data to show subfolder specification.
‘
‘   Last Modified: 21 Mar, 2012      - Initial version for public forums
‘
‘ DESCRIPTION This sample script is designed to create sessions from a text file (.csv format by default, but this can be edited to fit the format you have).
‘
‘ To launch this script, map a button on the button bar to run this script:    http://www.vandyke.com/support/tips/buttonbar.html
‘
‘ The first line of your data file should contain a comma-separated (or whatever you define as the g_strDelimiter below) list of supported "fields" designated by the following keywords: ----------------------------------------------------------------------------- session_name: The name that should be used for the session. If this field               does not exist, the hostname field is used as the session_name.       folder: Relative path for session as displayed in the Connect dialog.     hostname: The hostname or IP for the remote server.     protocol: The protocol (SSH2, SSH1, telnet, rlogin)         port: The port on which remote server is listening     username: The username for the account on the remote server    emulation: The emulation (vt100, xterm, etc.)  description: The comment/description. Multiple lines are separated with \r‘
‘ =============================================================================
‘
‘
‘ As mentioned above, the first line of the data file instructs this script as to the format of the fields in your data file and their meaning.  It is not a requirement that all the options be used. For example, notice the first line of the following file only uses the "hostname", "username", and "protocol" fields.  Note also that the "protocol" field can be defaulted so that if a protocol field is empty it will use the default value. -----------------------------------------------------------------------------   hostname,username,folder,protocol=SSH2   192.168.0.1,root,_imported,SSH1   192.168.0.2,admin,_imported,SSH2   192.168.0.3,root,_imported\folderA,   192.168.0.4,root,,   192.168.0.5,admin,_imported\folderB,telnet   ... and so on =============================================================================
‘
‘
‘ The g_strDefaultProtocol variable will only be defined within the ValidateFieldDesignations function if the protocol field has a default value (e.g., protocol=SSH2), as read in from the first line of the data file.
Dim g_strDefaultProtocol

 The g_strDefaultFolder variable will only be defined within the ValidateFieldDesignations function if the folder field has a default value (e.g., folder=Site34), as read in from the first line of the data file.
Dim g_strDefaultFolder

 The g_strDefaultUsername variable will only be defined within the ValidateFieldDesignations function if the username field has a default value (e.g., username=bensolo), as read in from the first line of the data file.
Dim g_strDefaultUsername

 If your data file uses spaces or a character other than comma as the delimiter, you would also need to edit the g_strDelimiter value a few lines below to indicate that fields are separated by spaces, rather than by commas. For example:   g_strDelimiter = " "

 Using a ";" might be a good alternative for a file that includes the comma character as part of any legitimate session name or folder name, etc.
Dim g_strDelimiter
g_strDelimiter = ","       comma g_strDelimiter = " "     space
 g_strDelimiter = ";"     semi-colon
 g_strDelimiter = chr(9)  tab
 g_strDelimiter = "|||"   a more unique example of a delimiter.

 The g_strSupportedFields indicates which of all the possible fields, are supported in this example script.  If a field designation is found in a data file that is not listed in this variable, it will not be imported into the session configuration.
Dim g_strSupportedFields
g_strSupportedFields = _
    "description,emulation,folder,hostname,port,protocol,session_name,username"

 If you wish to overwrite existing sessions, set the g_bOverwriteExistingSessions to True; for this example script, were playing
 it safe and leaving any existing sessions in place :).
Dim g_bOverwriteExistingSessions
g_bOverwriteExistingSessions = False

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_strHostsFile, g_strExampleHostsFile, g_strMyDocs, g_strMyDesktop
g_strMyDocs = g_shell.SpecialFolders("MyDocuments")
g_strMyDesktop = g_shell.SpecialFolders("Desktop")
g_strHostsFile = g_strMyDocs & "\MyDataFile.csv"
g_strExampleHostsFile = _
    vbtab & "hostname,protocol,username,folder,emulation" & vbcrlf & _
    vbtab & "192.168.0.1,SSH2,root,Linux Machines,XTerm" & vbcrlf & _
    vbtab & "192.168.0.2,SSH2,root,Linux Machines,XTerm" & vbcrlf & _
    vbtab & "..." & vbcrlf & _
    vbtab & "10.0.100.1,SSH1,admin,CISCO Routers,VT100" & vbcrlf & _
    vbtab & "10.0.101.1,SSH1,admin,CISCO Routers,VT100" & vbcrlf & _
    vbtab & "..." & vbcrlf & _
    vbtab & "myhost.domain.com,SSH2,administrator,Windows Servers,VShell" & _
    vbtab & "..." & vbcrlf
g_strExampleHostsFile = Replace(g_strExampleHostsFile, ",", g_strDelimiter)

Dim g_strConfigFolder, strFieldDesignations, vFieldsArray, vSessionInfo

g_strConfigFolder = GetConfigPath()

Dim strSessionName, strHostName, strPort
Dim strUserName, strProtocol, strEmulation
Dim strPathForSessions, strLine, nFieldIndex
Dim strSessionFileName, strFolder, nDescriptionLineCount, strDescription

Dim g_strLastError, g_strErrors, g_strSessionsCreated
Dim g_nSessionsCreated, g_nDataLines

g_strDateTimeTag = GetDateTimeTag()

g_strBogusLinesNotImported = ""

Import

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Sub Import()

    g_strHostsFile = crt.Dialog.FileOpenDialog( _
        "Please select the host data file to be imported.", _
        "Open", _
        g_strHostsFile, _
        "CSV/Text Files (*.txt;*.csv)|*.txt;*.csv|All files (*.*)|*.*")

    If g_strHostsFile = "" Then
        Exit Sub
    End If

     Open our data file for reading
    Dim objDataFile
    Set objDataFile = g_fso.OpenTextFile(g_strHostsFile, ForReading, False)

     Now read the first line of the data file to determine the field
     designations
    On Error Resume Next
    strFieldDesignations = objDataFile.ReadLine()
    nError = Err.Number
    strErr = Err.Description
    On Error Goto 0

    If nError <> 0 Then
        If nError = 62 Then
            crt.Dialog.MessageBox("Your data file is empty." & vbcrlf & _
                "Fill it with import data and try again." & vbcrlf & vbcrlf & _
                "ReadLine() Error code: " & nError & vbcrlf & _
                "ReadLine() Error text: " & strErr)
        Else
            crt.Dialog.MessageBox("Unable to read the first line from your data file!" & _
                vbcrlf & vbcrlf & _
                "ReadLine() Error code: " & nError & vbcrlf & vbcrlf & _
                "ReadLine() Error text: " & strErr)
        End If
        Exit Sub
    End If

     Validate the data file
    If Not ValidateFieldDesignations(strFieldDesignations) Then
        objDataFile.Close
        Exit Sub
    End If

     Get a timer reading so that we can calculate how long it takes to import.
    nStartTime = Timer

     Here we create an array of the items that will be used to create the new
     session, based on the fields separated by the delimiter specified in
     g_strDelimiter
    vFieldsArray = Split(strFieldDesignations, g_strDelimiter)

     Loop through reading each line in the data file and creating a session
     based on the information contained on each line.
    Do While Not objDataFile.AtEndOfStream
        strLine = ""
        strLine = objDataFile.ReadLine

        crt.Session.SetStatusText "Processing line #: " & _
                NN(objDataFile.Line - 1, 4)

         This sets v_File Data array elements to each section of strLine,
         separated by the delimiter
        vSessionInfo = Split(strLine, g_strDelimiter)
        If UBound(vSessionInfo) < UBound(vFieldsArray) Then
            If Trim(strLine) <> "" Then
                g_strErrors = g_strErrors & vbcrlf & _
                    "Insufficient data on line #" & _
                    NN(objDataFile.Line - 1, 4) & ": " & strLine
            Else
                g_strErrors = g_strErrors & vbcrlf & _
                    "Insufficient data on line #" & _
                    NN(objDataFile.Line - 1, 4) & ": [Empty Line]"
            End If
        ElseIf UBound(vSessionInfo) > UBound(vFieldsArray) Then
            g_strErrors = g_strErrors & vbcrlf & _
                "==> Number of data fields on line #" & _
                NN(objDataFile.Line - 1, 4) & _
                "(" & UBound(vSessionInfo) & ") " & _
                "does not match the number of fields in the header " & _
                "(" & UBound(vFieldsArray) & ")." & vbcrlf & _
                    "    This line will not be imported (Does the session name have a character that " & _
                    "matches the delimiter you‘re using? Also check for characters that Windows does not " & _
                    "allow to be used in filenames: /\:*?""<>|): " & vbcrlf & vbtab & strLine
            g_strBogusLinesNotImported = g_strBogusLinesNotImported & _
                vbcrlf & strLine
        Else

             Variable used to determine if a session file should actually be
             created, or if there was an unrecoverable error (and the session
             should be skipped).
            Dim bSaveSession
            bSaveSession = True

             Now we will match the items from the new file array to the correct
             variable for the sessions ini file
            For nFieldIndex = 0 To UBound(vSessionInfo)

                Select Case LCase(vFieldsArray(nFieldIndex))
                    Case "session_name"
                        strSessionName = vSessionInfo(nFieldIndex)
                         Check folder name for any invalid characters
                        Dim re
                        Set re = New RegExp
                        re.Pattern = "[\\\|\/\:\*\?\""\<\>]"
                        If re.Test(strSessionName) Then
                            bSaveSession = False
                            If g_strErrors <> "" Then g_strErrors = _
                                vbcrlf & g_strErrors

                            g_strErrors = _
                                "Error: " & _
                                "Invalid characters found in SessionName """ & _
                                strSessionName & """ specified on line #" & _
                                NN(objDataFile.Line - 1, 4) & _
                                ": " & strLine & g_strErrors

                            g_strBogusLinesNotImported = g_strBogusLinesNotImported & _
                                vbcrlf & strLine
                        End If

                    Case "port"
                        strPort = Trim(vSessionInfo(nFieldIndex))
                        If Not IsNumeric(strPort) Then
                            bSaveSession = False
                            If g_strErrors <> "" Then g_strErrors = _
                                vbcrlf & g_strErrors

                            g_strErrors = _
                                "Error: Invalid port """ & strPort & _
                                """ specified on line #" & _
                                NN(objDataFile.Line - 1, 4) & _
                                ": " & strLine & g_strErrors

                            g_strBogusLinesNotImported = g_strBogusLinesNotImported & _
                                vbcrlf & strLine
                        End If

                    Case "protocol"
                        strProtocol = Trim(lcase(vSessionInfo(nFieldIndex)))

                        Select Case strProtocol
                            Case "ssh2"
                                strProtocol = "SSH2"
                            Case "ssh1"
                                strProtocol = "SSH1"
                            Case "telnet"
                                strProtocol = "Telnet"
                            Case "serial", "tapi"
                                bSaveSession = False
                                g_strErrors = g_strErrors & vbcrlf & _
                                    "Error: Unsupported protocol """ & _
                                    vSessionInfo(nFieldIndex) & _
                                    """ specified on line #" & _
                                    NN(objDataFile.Line - 1, 4) & _
                                    ": " & strLine
                            Case "rlogin"
                                strProtocol = "RLogin"
                            Case Else
                                If g_strDefaultProtocol <> "" Then
                                    strProtocol = g_strDefaultProtocol
                                Else
                                    bSaveSession = False
                                    If g_strErrors <> "" Then g_strErrors = _
                                        vbcrlf & g_strErrors

                                    g_strErrors = _
                                        "Error: Invalid protocol """ & _
                                        vSessionInfo(nFieldIndex) & _
                                        """ specified on line #" & _
                                        NN(objDataFile.Line - 1, 4) & _
                                        ": " & strLine & g_strErrors

                                    g_strBogusLinesNotImported = g_strBogusLinesNotImported & _
                                        vbcrlf & strLine
                                End If
                        End Select  for protocols

                    Case "hostname"
                        strHostName = Trim(vSessionInfo(nFieldIndex))
                        If strHostName = "" Then
                            bSaveSession = False
                            g_strErrors = g_strErrors & vbcrlf & _
                                "Warning: ‘hostname‘ field on line #" & _
                                NN(objDataFile.Line - 1, 4) & _
                                " is empty: " & strLine

                            g_strBogusLinesNotImported = g_strBogusLinesNotImported & _
                                vbcrlf & strLine
                        End If

                    Case "username"
                        strUserName = Trim(vSessionInfo(nFieldIndex))

                    Case "emulation"
                        strEmulation = LCase(Trim(vSessionInfo(nFieldIndex)))
                        Select Case strEmulation
                            Case "xterm"
                                strEmulation = "Xterm"
                            Case "vt100"
                                strEmulation = "VT100"
                            Case "vt102"
                                strEmulation = "VT102"
                            Case "vt220"
                                strEmulation = "VT220"
                            Case "ansi"
                                strEmulation = "ANSI"
                            Case "linux"
                                strEmulation = "Linux"
                            Case "scoansi"
                                strEmulation = "SCOANSI"
                            Case "vshell"
                                strEmulation = "VShell"
                            Case "wyse50"
                                strEmulation = "WYSE50"
                            Case "wyse60"
                                strEmulation = "WYSE60"
                            Case Else
                                bSaveSession = False
                                g_strErrors = g_strErrors & vbcrlf & _
                                    "Warning: Invalid emulation """ & _
                                    strEmulation & """ specified on line #" & _
                                    NN(objDataFile.Line - 1, 4) & _
                                    ": " & strLine

                                g_strBogusLinesNotImported = g_strBogusLinesNotImported & _
                                    vbcrlf & strLine
                        End Select

                    Case "folder"
                        strFolder = Trim(vSessionInfo(nFieldIndex))

                         Check folder name for any invalid characters
                         Note that a folder can have subfolder designations,
                         so / is a valid character for the folder (path).
                        Set re = New RegExp
                        re.Pattern = "[\|\:\*\?\""\<\>]"
                        If re.Test(strFolder) Then
                            bSaveSession = False
                            If g_strErrors <> "" Then g_strErrors = _
                                vbcrlf & g_strErrors

                            g_strErrors = _
                                "Error: Invalid characters in folder """ & _
                                strFolder & """ specified on line #" & _
                                NN(objDataFile.Line - 1, 4) & _
                                ": " & strLine & g_strErrors

                            g_strBogusLinesNotImported = g_strBogusLinesNotImported & _
                                vbcrlf & strLine
                        End If

                    Case "description"
                        strCurDescription = Trim(vSessionInfo(nFieldIndex))
                        If strDescription = "" Then
                            strDescription = strCurDescription
                        Else
                            strDescription = strDescription & "\r" & strCurDescription
                        End If

                    Case Else
                         If there is an entry that the script is not set to use
                         in strFieldDesignations, stop the script and display a
                         message
                        Dim strMsg1
                        strMsg1 = "Error: Unknown field designation: " & _
                            vFieldsArray(nFieldIndex) & vbcrlf & vbcrlf & _
                            "       Supported fields are as follows: " & _
                            vbcrlf & vbcrlf & vbtab & g_strSupportedFields & _
                            vbcrlf & _
                            vbcrlf & "       For a description of " & _
                            "supported fields, please see the comments in " & _
                            "the sample script file."

                        If Trim(g_strErrors) <> "" Then
                            strMsg1 = strMsg1 & vbcrlf & vbcrlf & _
                                "Other errors found so far include: " & _
                                g_strErrors
                        End If

                        MsgBox strMsg1, _
                            vbOkOnly, _
                            "Import Data To SecureCRT Sessions: Data File Error"
                        Exit Sub
                End Select
            Next

            If bSaveSession Then
                 Use hostname if a session_name field wasnt present
                If strSessionName = "" Then
                    strSessionName = strHostName
                End If

                If strFolder = "" Then
                    strFolder = g_strDefaultFolder
                End If

                 Canonicalize the path to the session, as needed
                strSessionPath = strSessionName
                If strFolder <> "" Then
                    strSessionPath = strFolder & "/" & strSessionName
                End If
                 Strip any leading / characters from the session path
                If Left(strSessionPath, 1) = "/" Then
                    strSessionPath = Mid(strSessionPath, 2)
                End If

                If SessionExists(strSessionPath) Then
                    If Not g_bOverwriteExistingSessions Then
                         Append a unique tag to the session name, if it already exists
                        strSessionPath = strSessionPath & _
                            "(import_" & GetDateTimeTag & ")"
                    End If
                End If

                 Now: Create the session.

                 Copy the default session settings into new session name and set the
                 protocol.  Setting protocol protocol is essential since some variables
                 within a config are only available with certain protocols.  For example,
                 a telnet configuration will not be allowed to set any port forwarding
                 settings since port forwarding settings are specific to SSH.
                Set objConfig = crt.OpenSessionConfiguration("Default")
                If strProtocol = "" Then
                    strProtocol = g_strDefaultProtocol
                End If
                objConfig.SetOption "Protocol Name", strProtocol

                 We opened a default session & changed the protocol, now we
                 save the config to the new session path:
                objConfig.Save strSessionPath

                 Now, lets open the new session configuration weve
                 saved, and set up the various parameters that were specified
                 in the file.
                If Not SessionExists(strSessionPath) Then
                    crt.Dialog.MessageBox("Failed to create a new session ‘" & _
                        strSessionPath & "‘." & vbcrlf & _
                        vbcrlf & _
                        "Does your configuration folder have " & _
                        "sufficient permissions to allow writing/creating " & _
                        "files?" & vbcrlf & vbcrlf & _
                        vbtab & _
                        "Options > Global Options > Configuration Paths" & _
                        vbcrlf & vbcrlf & _
                        "Fix permissions on your configuration folder and " & _
                        "then try running this script again.")
                    Exit Sub
                End If
                Set objConfig = crt.OpenSessionConfiguration(strSessionPath)

                objConfig.SetOption "Emulation", strEmulation

                If LCase(strProtocol) <> "serial" Then
                    If strHostName <> "" Then
                        objConfig.SetOption "Hostname", strHostName
                    End If
                    If strUsername = "" Then
                        strUsername = g_strDefaultUsername
                    End If
                    If strUserName <> "" Then
                        objConfig.SetOption "Username", strUserName
                    End If
                End If

                If strDescription <> "" Then
                    objConfig.SetOption "Description", Split(strDescription, "\r")
                End If

                If UCase(strProtocol) = "SSH2" Then
                    If strPort = "" Then strPort = 22
                    objConfig.SetOption "[SSH2] Port", CLng(strPort)
                End If
                If UCase(strProtocol) = "SSH1" Then
                    If strPort = "" Then strPort = 22
                    objConfig.SetOption "[SSH1] Port", CLng(strPort)
                End If
                If UCase(strProtocol) = "TELNET" Then
                    If strPort = "" Then strPort = 23
                    objConfig.SetOption "Port", CLng(strPort)
                End If

                 If you would like ANSI Color enabled for all imported sessions (regardless
                 of value in Default session, remove comment from following line)
                 objConfig.SetOption "ANSI Color", True

                 Add other "SetOption" calls desired here...
                 objConfig.SetOption "Auto Reconnect", True
                 objConfig.SetOption "Color Scheme", "Traditional"
                 objConfig.SetOption "Color Scheme Overrides Ansi Color", True
                 objConfig.SetOption "Copy to clipboard as RTF and plain text", True
                 objConfig.SetOption "Description", Array("This session was imported from a script on " & Now)
                 objConfig.SetOption "Firewall Name", "YOUR CUSTOM FIREWALL NAME HERE"
                 objConfig.SetOption "Line Send Delay", 15
                 objConfig.SetOption "Log Filename V2", "${VDS_USER_DATA_PATH}\_ScrtLog(%S)_%Y%M%D_%h%m%s.%t.txt"
                 objConfig.SetOption "Rows", 60
                 objConfig.SetOption "Cols", 140
                 objConfig.SetOption "Start Tftp Server", True
                 objConfig.SetOption "Use Word Delimiter Chars", True
                 objConfig.SetOption "Word Delimiter Chars", " <>()+=$%!#*"
                 objConfig.SetOption "X Position", 100
                 objConfig.SetOption "Y Position", 50

                objConfig.Save

                If g_strSessionsCreated <> "" Then
                    g_strSessionsCreated = g_strSessionsCreated & vbcrlf
                End If
                g_strSessionsCreated = g_strSessionsCreated & "    " & strSessionPath

                g_nSessionsCreated = g_nSessionsCreated + 1

            End If

             Reset all variables in preparation for reading in the next line of
             the hosts info file.
            strEmulation = ""
            strPort = ""
            strHostName = ""
            strFolder = ""
            strUserName = ""
            strSessionName = ""
            strDescription = ""
            nDescriptionLineCount = 0
        End If

    Loop

    g_nDataLines = objDataFile.Line
    objDataFile.Close

    crt.Session.SetStatusText ""

    Dim strResults
    strResults = "Import operation completed in " & _
        GetMinutesAndSeconds(Timer - nStartTime)

    If g_nSessionsCreated > 0 Then
        strResults = strResults & _
            vbcrlf & _
            String(70, "-") & vbcrlf & _
            "Number of Sessions created: " & g_nSessionsCreated & vbcrlf & _
            vbcrlf & _
            g_strSessionsCreated
    Else
        strResults = strResults & vbcrlf & _
            String(70, "-") & vbcrlf & _
            "No sessions were created from " & g_nDataLines & " lines of data."
    End If

    If g_strErrors = "" Then
        strResults = "No errors/warnings encountered from the import operation." & vbcrlf & vbcrlf & strResults
    Else
        strResults = "Errors/warnings from this operation include: " & g_strErrors & vbcrlf & _
            String(70, "-") & vbcrlf & _
            strResults
    End If

    If g_strBogusLinesNotImported <> "" Then
        strResults = _
            "The following lines from the data file were *not* imported for " & _
            "various reasons detailed below:" & vbcrlf & _
            String(70, "=") & vbcrlf & _
            strFieldDesignations & _
            g_strBogusLinesNotImported & vbcrlf & _
            String(70, "-") & vbcrlf & _
            "Fix the above lines to resolve the issue and save the fixed lines " & _
            "to a new file. You can then run this script again to import these " & _
            "skipped sessions." & vbcrlf & vbcrlf & strResults
    End If


    Set cFilenames = CreateObject("Scripting.Dictionary")
    cFilenames.Add Replace(g_strMyDocs & "/__SecureCRT-Session-ImportLog-" & g_strDateTimeTag & ".txt", "\", "/"), ""
    cFilenames.Add Replace(g_strMyDesktop & "/__SecureCRT-Session-ImportLog-" & g_strDateTimeTag & ".txt", "\", "/"), ""
    cFilenames.Add Replace(g_strConfigFolder & "/__SecureCRT-Session-ImportLog-" & g_strDateTimeTag & ".txt", "\", "/"), ""

    bSuccess = False

    strResults = strResults & vbcrlf & vbcrlf & _
        String(80, "-") & vbcrlf

    For Each strFilename In cFilenames.Keys():
        On Error Resume Next
        Set objFile = g_fso.OpenTextFile(strFilename, ForWriting, True)
        strErr = Err.Description
        nError = Err.Number
        On Error Goto 0
        If nError = 0 Then
            bSuccess = True
            Exit For
        Else
            crt.Session.SetStatusText("Unable to open results file.")
            strResults = strResults & vbcrlf & _
                "Failed to write summary results to: " & strFilename
        End If

        If Not g_fso.FileExists(strFilename) Then
            bSuccess = False
        Else
            Exit For
        End If
    Next

    If Not bSuccess Then
        crt.Clipboard.Text = strResults
        crt.Dialog.MessageBox( _
            "Attempted to write summary results to the file locations below, " & _
            "but access was denied." & vbcrlf & vbtab & vbcrlf & vbtab & _
            Join(cFilenames.Keys(), vbcrlf & vbtab) & vbcrlf & vbcrlf & _
            "Results are in the clipboard. " & _
            "Paste this data into your favorite app now to see what occurred.")
        Exit Sub
    End If

    objFile.WriteLine strResults
    objFile.Close

     Display the log file as an indication that the information has been
     imported.
    g_shell.Run chr(34) & strFilename & chr(34), 5, False
End Sub

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~      Helper Methods and Functions~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Function ValidateFieldDesignations(ByRef strFields)
    If Instr(strFieldDesignations, g_strDelimiter) = 0 Then
        Dim strErrorMsg, strDelimiterDisplay
        strErrorMsg = "Invalid header line in data file. " & _
            "Delimiter character not found: "
        If Len(g_strDelimiter) > 1 Then
            strDelimiterDisplay = g_strDelimiter
        Else
            If Asc(g_strDelimiter) < 33 or Asc(g_strDelimiter) > 126 Then
                strDelimiterDisplay = "ASCII[" & Asc(g_strDelimiter) & "]"
            Else
                strDelimiterDisplay = g_strDelimiter
            End If
        End If
        strErrorMsg = strErrorMsg & strDelimiterDisplay & vbcrlf & vbcrlf & _
            "The first line of the data file is a header line " & _
            "that must include" & vbcrlf & _
            "a ‘" & strDelimiterDisplay & _
            "‘ separated list of field keywords." & vbcrlf & _
            vbcrlf & "‘hostname‘ is a required key word." & _
            vbcrlf & vbcrlf & _
            "The remainder of the lines in the file should follow the " & _
            vbcrlf & _
            "pattern established by the header line " & _
            "(first line in the file)." & vbcrlf & "For example:" & vbcrlf & _
            g_strExampleHostsFile
        MsgBox strErrorMsg, _
               vbOkOnly, _
               "Import Data To SecureCRT Sessions"
        Exit Function
    End If

    If Instr(LCase(strFieldDesignations), "hostname") = 0 Then
        strErrorMsg = "Invalid header line in data file. " & _
            "‘hostname‘ field is required."
        If Len(g_strDelimiter) > 1 Then
            strDelimiterDisplay = g_strDelimiter
        Else
            If Asc(g_strDelimiter) < 33 Or Asc(g_strDelimiter) > 126 Then
                strDelimiterDisplay = "ASCII[" & Asc(g_strDelimiter) & "]"
            Else
                strDelimiterDisplay = g_strDelimiter
            End If
        End If

        MsgBox strErrorMsg & vbcrlf & _
            "The first line of the data file is a header line " & _
            "that must include" & vbcrlf & _
            "a ‘" & strDelimiterDisplay & _
            "‘ separated list of field keywords." & vbcrlf & _
            vbcrlf & "‘hostname‘ is a required keyword." & _
            vbcrlf & vbcrlf & _
            "The remainder of the lines in the file should follow the " & _
            vbcrlf & _
            "pattern established by the header line " & _
            "(first line in the file)." & vbcrlf & "For example:" & vbcrlf & _
            g_strExampleHostsFile, _
            vbOkOnly, _
            "Import Data To SecureCRT Sessions"
        Exit Function
    End If

    If Instr(LCase(strFieldDesignations), "protocol") = 0 Then
        Set objConfig = crt.OpenSessionConfiguration("Default")
        g_strDefaultProtocol = objConfig.GetOption("Protocol Name")
    Else
         We found "protocol", now look for a default protocol designation
        vFields = Split(strFields,g_strDelimiter)
        For each strField In vFields
            If (InStr(LCase(strField), "protocol") > 0) And _
               (Instr(LCase(strField), "=") >0) Then
                    g_strDefaultProtocol = UCase(Split(strField, "=")(1))

                     Fix the protocol field since we know the default protocol
                     value
                    strFields = Replace(strFields, strField, "protocol")
            End If
        Next
    End If

    vFields = Split(strFields, g_strDelimiter)
    For Each strField In vFields
        If (Instr(LCase(strField), "folder") > 0) And _
           (Instr(LCase(strField), "=") > 0) Then
            g_strDefaultFolder = Split(strField, "=")(1)

             Fix the folder field since we know the default folder
            strFields = Replace(strFields, strField, "folder")
        End If

        If (Instr(LCase(strField), "username") > 0) And _
           (Instr(LCase(strField), "=") > 0) Then
           g_strDefaultUsername = Split(strField, "=")(1)

            Fix the username field since we know the default username
           strFields = Replace(strFields, strField, "username")
        End If
    Next

    ValidateFieldDesignations = True
End Function

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Function ReadRegKey(strKeyPath)
    On Error Resume Next
    Err.Clear
    ReadRegKey = g_shell.RegRead(strKeyPath)
    If Err.Number <> 0 Then
         Registry key must not have existed.
         ReadRegKey will already be empty, but for the sake of clarity, well
         set it to an empty string explicitly.
        ReadRegKey = ""
    End If
    On Error Goto 0
End Function

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Function CreateFolderPath(strPath)
 Recursive function
    If g_fso.FolderExists(strPath) Then
        CreateFolderPath = True
        Exit Function
    End If

     Check to see if weve reached the drive root
    If Right(strPath, 2) = ":\" Then
        CreateFolderPath = True
        Exit Function
    End If

     None of the other two cases were successful, so attempt to create the
     folder
    On Error Resume Next
    g_fso.CreateFolder strPath
    nError = Err.Number
    strErr = Err.Description
    On Error Goto 0
    If nError <> 0 Then
         Error 76 = Path not found, meaning that the full path doesnt exist.
         Call ourselves recursively until all the parent folders have been
         created:
        If nError = 76 Then _
            CreateFolderPath(g_fso.GetParentFolderName(strPath))

        On Error Resume Next
        g_fso.CreateFolder strPath
        nError = Err.Number
        strErr = Err.Description
        On Error Goto 0

         If the Error is not = 76, then we have to bail since we no longer have
         any hope of successfully creating each folder in the tree
        If nError <> 0 Then
            g_strLastError = strErr
            Exit Function
        End If
    End If

    CreateFolderPath = True
End Function

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Function NN(nNumber, nDesiredDigits)
 Normalizes a number to have a number of zeros in front of it so that the total length of the number (displayed as a string) is nDesiredDigits.
    Dim nIndex, nOffbyDigits, strResult
    nOffbyDigits = nDesiredDigits - Len(nNumber)

    NN = nNumber

    If nOffByDigits = 0 Then Exit Function

    If nOffByDigits > 0 Then
         The number provided doesnt have enough digits
        strResult = String(nOffbyDigits, "0") & nNumber
    Else
         The number provided has too many digits.

        nOffByDigits = Abs(nOffByDigits)

         Only remove leading digits if theyre all insignificant (0).
        If Left(nNumber, nOffByDigits) = String(nOffByDigits, "0") Then
            strResult = Mid(nNumber, nOffByDigits + 1)
        Else
             If leading digits beyond desired number length arent 0, well
             return the number as originally passed in.
            strResult = nNumber
        End If
    End If

    NN = strResult
End Function

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Function GetMinutesAndSeconds(nTotalSecondsElapsed)
    Dim nMinutesElapsed, nSecondsValue, nSecondsElapsed

    If nTotalSecondsElapsed = 0 Then
        GetMinutesAndSeconds = "less than a second."
        Exit Function
    End If

     Convert seconds into a fractional minutes value.
    nMinutesElapsed = nTotalSecondsElapsed / 60

     Convert the decimal portion into the number of remaining seconds.
    nSecondsValue = nMinutesElapsed - Fix(nMinutesElapsed)
    nSecondsElapsed = Fix(nSecondsValue * 60)

     Remove the fraction portion of minutes value, keeping only the digits to
     the left of the decimal point.
    nMinutesElapsed = Fix(nMinutesElapsed)

     Calculate the number of milliseconds using the four most significant
     digits of only the decimal fraction portion of the number of seconds
     elapsed.
    nMSeconds = Fix(1000 * (nTotalSecondsElapsed - Fix(nTotalSecondsElapsed)))

     Form the final string to be returned and set it as the value of our
     function.
    GetMinutesAndSeconds = nMinutesElapsed & " minutes, " & _
        nSecondsElapsed & " seconds, and " & _
        nMSeconds & " ms"
End Function


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Function SessionExists(strSessionPath)
 Returns True if a session specified as value for strSessionPath already exists within the SecureCRT configuration. Returns False otherwise.
    On Error Resume Next
    Set objTosserConfig = crt.OpenSessionConfiguration(strSessionPath)
    nError = Err.Number
    strErr = Err.Description
    On Error Goto 0
     We only used this to detect an error indicating non-existance of session.
     Lets get rid of the reference now since we wont be using it:
    Set objTosserConfig = Nothing
     If there wasnt any error opening the session, then its a 100% indication
     that the session named in strSessionPath already exists
    If nError = 0 Then
        SessionExists = True
    Else
        SessionExists = False
    End If
End Function

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Function GetDateTimeTag()
     Use WMI to get at the current time values.  This info will be used
     to avoid overwriting existing sessions by naming new sessions with
     the current (unique) timestamp.
    Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
    Set colItems = objWMIService.ExecQuery("Select * from Win32_OperatingSystem")
    For Each objItem In colItems
        strLocalDateTime = objItem.LocalDateTime
        Exit For
    Next
     strLocalDateTime has the following pattern:
     20111013093717.418000-360   [ That is,  YYYYMMDDHHMMSS.MILLIS(zone) ]
    GetDateTimeTag = Left(strLocalDateTime, 18)
End Function

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Function GetConfigPath():
    Set objConfig = crt.OpenSessionConfiguration("Default")
     Try and get at where the configuration folder is located. To achieve
     this goal, well use one of SecureCRTs cross-platform path
     directives that means "THE path this instance of SecureCRT
     is using to load/save its configuration": ${VDS_CONFIG_PATH}.

     First, lets use a session setting that we know will do the
     translation between the cross-platform moniker ${VDS_CONFIG_PATH}
     and the actual value... say, "Upload Directory V2"
    strOptionName = "Upload Directory V2"

     Stash the original value, so we can restore it later...
    strOrigValue = objConfig.GetOption(strOptionName)

     Now set the value to our moniker...
    objConfig.SetOption strOptionName, "${VDS_CONFIG_PATH}"
     Make the change, so that the above templated name will get written
     to the config...
    objConfig.Save

     Now, load a fresh copy of the config, and pull the option... so
     that SecureCRT will convert from the template path value to the
     actual path value:
    Set objConfig = crt.OpenSessionConfiguration("Default")
    strConfigPath = objConfig.GetOption(strOptionName)

     Now, lets restore the setting to its original value
    objConfig.SetOption strOptionName, strOrigValue
    objConfig.Save

     Now return the config path
    GetConfigPath = strConfigPath
End Function
View Code

 

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!