查找字符串中特定字符集合后的值
问题描述:
所以我正在运行一个批处理文件,该文件将从字符串中提取特定变量的值。例如:查找字符串中特定字符集合后的值
[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可不可以通过批处理脚本来完成?
答
@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
设置为报告字符串,然后使用字符串var
上的标准for
功能。当前身串[pid:
被发现,设置result
到什么这样,当for
传送下一个字符串%%a
,result
将是不确定的和%%a
不会[pid:
- 然后设置result
到找到字符串(这意味着result
现定义)
在处理剩余的字符串之后,所需要的只是从result
中删除最后一个字符。
另一种方法是
FOR %%a IN (%var:]=%) DO IF "%%a"=="[pid:" (
这将与什么更换]
字符,这意味着这样继for
环路set
设置为result
值将不要求拆除的最后一个字符将不是必需的。
我插入了两行来删除(
和)
,这会导致您发布的新数据出现问题。请注意,导出并处理了一个新变量var1
。
有一些字符会导致cmd
问题并需要特殊处理。 !
将引起问题,如果delayedexpansion
被调用,但我们需要知道这种类型的信息之前设计一个解决方案,因为它a影响所需的代码。
代码会在后面找到字符串字符串[pid:
出现在变量中。以下字符串PID
将被忽略。
答
的另一种方法,I learned just yesterday
@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%
缺点:需要的文件;创建一个永久的环境变量(当然可以很容易地删除)
感谢它为那个特定的例子工作。但是,我想我给出的例子不够健壮。我已经更新了这个例子,它似乎没有为它工作,但它应该,因为我相信for循环只考虑第一个PID值正确?此外,我还设置了enabledelayedexpansion,它会影响代码吗? –
我对代码进行了几次测试,看起来%% a在第一次迭代中占据了整行,而不是直到空间。任何想法为什么? –
我看不到你的测试,但我会得出结论,你的变量是“引用” – Magoo