所以我希望运行一个批处理文件,它可以从字符串中提取特定变量的值。例如:
[2017-11-03T12:18:56.263733+00:00] [XFM] [TRACE:1] [EPMHFM-00000] [XFM] [ecid: XDS.0000.0000.0000.0001] [File: CHsvDSSystemInfo.cpp] [Line: 6002] [userId: ] [appName: GGCOST] [pid: 9640] [tid: 6632] [host: AWEU1ORHYAP05P] [nwaddr: 172.20.36.105:0;] [errorCode: 0] [srcException: NotSpec] [errType: 1] [dbUpdate: 1] [11.1.2.4.202.5211] [[SYSINFO:Application=GGCOST; PID=9640; NumUsers=0; CPU(Cores)=8; NumTasks=0; NumErrors=1; PhysicalMem=60129071104; UsedPhysicalMem=38635540480; ProcUsedPhysicalMem=3277619200; VirtualMem=140737488224256; UsedVirtualMem=5590806528; ProcUsedVirtualMem=3582775296; UsedCPU=9.3284; ProcUsedCPU=56.3594; NumCubesInRAM=7007; NumDataRecordsInRAM=1693604; NumRecordsInLargestCube=92334]]
从上面的字符串中,我希望提取pid编号,在这种情况下是6212.可以通过批处理脚本完成吗?
答案 0 :(得分:1)
@ECHO OFF
SETLOCAL
SET "var=[2017-11-11T07:27:23.088173+00:00] [XFM] [TRACE:1] [EPMHFM-00000] [XFM] [ecid: ] [File: XFMDataSource.cpp] [Line: 508] [userId: ] [Msg arguments: ] [appName: MyApp] [pid: 6212] [tid: 3176] [host: Server1] [nwaddr: 172.24.62.192:0;] [errorCode: 0] [srcException: NotSpec] [errType: 1] [[XDS: XFMDataSource process exiting now ...]] "
SET "var1=%var:(= %"
SET "var1=%var1:)= %"
SET "result=not found "
FOR %%a IN (%var1%) DO IF "%%a"=="[pid:" (
SET "result="
) ELSE (
IF NOT defined result SET result=%%a
)
SET "result=%result:~0,-1%"
ECHO result is %result%
GOTO :EOF
所以是的,这是可能的。这是众多方式之一。
首先将result
设置为报告字符串,然后使用字符串for
上的标准var
功能。找到前导字符串[pid:
后,将result
设置为 nothing ,以便for
将下一个字符串发送到%%a
,{{1 }将是未定义的,result
将不是%%a
- 然后将[pid:
设置为找到的字符串(这意味着result
现在已定义)
处理完剩余的字符串后,只需从result
中删除最终字符。
另一种方法是
result
会用 nothing 替换FOR %%a IN (%var:]=%) DO IF "%%a"=="[pid:" (
字符,这意味着设置为]
的值不需要删除最后一个字符,因此{{1}不需要跟随result
循环。
我已插入两行以删除set
和for
,这会导致您发布的新数据出现问题。请注意,派生并处理了一个新变量(
。
有许多字符导致)
问题并需要特殊处理。如果var1
被调用,cmd
将导致问题,但我们需要在设计解决方案之前了解此类信息,因为它 a 会影响代码必需的。
代码将在变量中的字符串!
的 last 外观后面找到字符串。 delayedexpansion
后面的字符串将被忽略。
答案 1 :(得分:1)
@echo off
>t.txt echo [2017-11-03T12:18:56.263733+00:00] [XFM] [TRACE:1] [EPMHFM-00000] [XFM] [ecid: XDS.0000.0000.0000.0001] [File: CHsvDSSystemInfo.cpp] [Line: 6002] [userId: ] [appName: GGCOST] [pid: 9640] [tid: 6632] [host: AWEU1ORHYAP05P] [nwaddr: 172.20.36.105:0;] [errorCode: 0] [srcException: NotSpec] [errType: 1] [dbUpdate: 1] [11.1.2.4.202.5211] [[SYSINFO:Application=GGCOST; PID=9640; NumUsers=0; CPU(Cores)=8; NumTasks=0; NumErrors=1; PhysicalMem=60129071104; UsedPhysicalMem=38635540480; ProcUsedPhysicalMem=3277619200; VirtualMem=140737488224256; UsedVirtualMem=5590806528; ProcUsedVirtualMem=3582775296; UsedCPU=9.3284; ProcUsedCPU=56.3594; NumCubesInRAM=7007; NumDataRecordsInRAM=1693604; NumRecordsInLargestCube=92334]]
for /F "tokens=3" %%a in ('"setx /F t.txt /D ] dummyVar /R 0,1 [pid:"') do set "var=%%a" & goto continue
:continue
set "var=%var:~0,-1%"
echo %var%
缺点:需要一个文件;创建一个永久环境变量(当然可以轻松删除)