Windows脚本从命令输出中parsingWebSphere JVM的名称

我正在写一个(batch file或VBScript)来很好地closuresWindows服务器上所有正在运行的WebSphere JVM,但需要一些文本处理方面的帮助。 我希望脚本运行并parsing“serverstatus”命令的输出以获取应用程序服务器的名称,并将匹配(与回车符)存储在一个variables中供脚本的其余部分使用。

示例命令输出:

C:\WebSphere\AppServer\bin>serverstatus -all ADMU0116I: Tool information is being logged in file C:\WebSphere\AppServer\profiles\MySrv01\logs\serverStatus.log ADMU0128I: Starting tool with the MySrv01 profile ADMU0503I: Retrieving server status for all servers ADMU0505I: Servers found in configuration: ADMU0506I: Server name: MyCluster_MySrv01 ADMU0506I: Server name: MyCluster_MySrv01_1 ADMU0506I: Server name: MyNextCluster_MySrv04 ADMU0506I: Server name: MyNextCluster_MySrv04_1 ADMU0506I: Server name: nodeagent ADMU0508I: The Application Server "MyCluster_MySrv01" is STARTED ADMU0508I: The Application Server "MyCluster_MySrv01_1" is STARTED ADMU0508I: The Application Server "MyNextCluster_MySrv04" is STARTED ADMU0509I: The Application Server "MyNextCluster_MySrv04_1" cannot be reached. It appears to be stopped. ADMU0508I: The Node Agent "nodeagent" is STARTED 

* nodeagent不应该匹配。 对于是否要定位所有的应用程序服务器或只是那些状态为“已启动”的评审团而言,评审团仍然没有确定。

这是使用正则表达式的替代方法。 它只是读取stdout并处理所有已启动的应用程序服务器 – 应用程序服务器存储在名为Appservers的数组中。 测试W2K3。 编辑:我们添加了一种方法来通过添加日志写入功能将日志输出记录到文件中(不要忘记在我们刚刚添加到此答案的脚本开始处添加const ForAppending) 。 日志写入功能的格式为:

 Logwrite "some text to write - delete file if exists", "c:\Path\filename.txt", 1 Logwrite "some text to write - append to file, don't delete", "c:\path\filename.txt", 0 

这是一个粗糙的功能,但是按照你的要求。 我希望有帮助。 🙂

 option explicit Const ForAppending = 8 Dim objShell, objWshScriptExec, objStdOut Dim objCmdString, strLine, appservers(), maxAppservers Dim x ' File Path / Location to serverstatus.bat ---- objCmdString = "C:\WebSphere\Appserver\bin\serverstatus.bat -all" Set objShell = CreateObject("WScript.Shell") Set objWshScriptExec = objShell.Exec(objCmdString) Set objStdOut = objWshScriptExec.StdOut MaxAppservers = -1 ' While we're looping through the response from the serverstatus command, look for started application servers ' and store them in an ever expanding array Appservers. ' The Variable MaxAppservers should always contain the highest number of Appservers (ie: ubound(Appservers)) While Not objStdOut.AtEndOfStream strLine = objStdOut.ReadLine If InStr(LCase(strLine), "admu0508i: the application server """) Then MaxAppservers = MaxAppservers + 1 ReDim Preserve Appservers(MaxAppservers) Appservers(MaxAppservers) = wedge(strLine, Chr(34)) End If Wend If MaxAppservers => 0 then For x = 0 To ubound(Appservers) ' You could just use For x = 1 to MaxAppservers in this case. ' Add your instructions here......... ' ... We are simply echoing out the Appserver name below as an example to a log file as requested below. Logwrite Appservers(x), "c:\Output.log", 0 Next End If Function Wedge(wStr, wOpr) ' This clunky function simply grabs a section of a string the is encapsulated by wOpr. ' NOTE: This function expects wOpr to be a single character (eg; for our purpose, it is pulling data between double quotes). Dim wFlag, wCount, wFinish wflag = False wFinish = False wCount = 1 Wedge = "" Do Until wCount > Len(wStr) Or wFinish If Mid(wStr, wCount, 1) = wOpr Then If wFlag Then wFinish = True Else wFlag = True End If Else If wFlag Then Wedge = Wedge & Mid(wStr, wCount, 1) End If wCount = wCount + 1 Loop End Function Function logwrite (lstrtxt, lwLogfile, lwflag) Dim lwObjFSO, lwObjFile, fstr, lwcounter, lwc fstr = lstrtxt Set lwObjFSO = CreateObject("Scripting.FileSystemObject") If lwflag=1 And lwObjFSO.FileExists(lwLogFile) Then lwObjfso.deletefile(lwLogFile) If lwObjFSO.FileExists(lwLogFile) then On Error Resume next Set lwObjFile = lwObjFSO.OpenTextFile(lwLOgFile, ForAppending) lwCounter = 20000 Do While Err.number = 70 And lwCounter > 0 wscript.echo "ERROR: Retrying output - Permission denied; File may be in use!" For lwc = 1 To 1000000 Next Err.clear Set lwObjFile = lwObjFSO.OpenTextFile(lwLogFile, ForAppending) lwCounter = lwCounter-1 Loop If Err.number <> 0 Then wscript.echo "Error Number: "&Err.number wscript.quit End If On Error goto 0 Else Set lwObjFile = lwObjFSO.CreateTextFile(lwLogFile) End If wscript.echo (fstr) lwObjFile.Write (fstr) & vbcrlf lwObjFile.Close Set lwObjFSO=Nothing Set lwObjfile=Nothing End Function 

使用RegExp从输入中剪切引用的名称; 添加上下文 – 服务器,开始 – 微调结果集。 在代码中:

 Option Explicit Function q(s) : q = "'" & s & "'" : End Function Dim sInp : sInp = Join(Array( _ "ADMU0116I: Tool information is being logged in file C:\WebSphere\Appserver\profiles\MySrv01\logs\serverStatus.log" _ , "ADMU0128I: Starting tool with the MySrv01 profile" _ , "ADMU0503I: Retrieving server status for all servers" _ , "ADMU0505I: servers found in configuration:" _ , "ADMU0506I: server name: MyCluster_MySrv01" _ , "ADMU0506I: server name: MyCluster_MySrv01_1" _ , "ADMU0506I: server name: MyNextCluster_MySrv04" _ , "ADMU0506I: server name: MyNextCluster_MySrv04_1" _ , "ADMU0506I: server name: nodeagent" _ , "ADMU0508I: The Application server ""MyCluster_MySrv01"" is STARTED" _ , "ADMU0508I: The Application server ""MyCluster_MySrv01_1"" is STARTED" _ , "ADMU0508I: The Application server ""MyNextCluster_MySrv04"" is STARTED" _ , "ADMU0509I: The Application server ""MyNextCluster_MySrv04_1"" cannot be reached. It appears to be stopped." _ , "ADMU0508I: The Node Agent ""nodeagent"" is STARTED" _ ), vbCrLf) Dim aRes : aRes = Array( _ Array("all quoted names", """([^""]+)""") _ , Array("all quoted started servers", "server ""([^""]+)"" is STARTED") _ ) Dim aRE For Each aRe In aRes WScript.Echo "----------------", q(aRe(0)), q(aRe(1)) Dim re : Set re = New RegExp re.Global = True re.Pattern = aRe(1) Dim oMTS : Set oMTS = re.Execute(sInp) ReDim a(oMTS.Count - 1) Dim i For i = 0 To UBound(a) a(i) = q(oMTS(i).SubMatches(0)) Next WScript.Echo " =>", Join(a) Next 

输出:

 cscript 20984738.vbs ---------------- 'all quoted names' '"([^"]+)"' => 'MyCluster_MySrv01' 'MyCluster_MySrv01_1' 'MyNextCluster_MySrv04' 'MyNextCluster_MySrv04_1' 'nodeagent' ---------------- 'all quoted started servers' 'server "([^"]+)" is STARTED' => 'MyCluster_MySrv01' 'MyCluster_MySrv01_1' 'MyNextCluster_MySrv04'