2017-11-11 190 views
0

所以我正在运行一个批处理文件,该文件将从字符串中提取特定变量的值。例如:查找字符串中特定字符集合后的值

[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可不可以通过批处理脚本来完成?

回答

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设置为报告字符串,然后使用字符串var上的标准for功能。当前身串[pid:被发现,设置result什么这样,当for传送下一个字符串%%aresult将是不确定的和%%a不会[pid: - 然后设置result到找到字符串(这意味着result现定义)

在处理剩余的字符串之后,所需要的只是从result中删除最后一个字符。

另一种方法是

FOR %%a IN (%var:]=%) DO IF "%%a"=="[pid:" (

这将与什么更换]字符,这意味着这样继for环路set设置为result值将不要求拆除的最后一个字符将不是必需的。

我插入了两行来删除(),这会导致您发布的新数据出现问题。请注意,导出并处理了一个新变量var1

有一些字符会导致cmd问题并需要特殊处理。 !将引起问题,如果delayedexpansion被调用,但我们需要知道这种类型的信息之前设计一个解决方案,因为它a影响所需的代码。

代码会在后面找到字符串字符串[pid:出现在变量中。以下字符串PID将被忽略。

+0

感谢它为那个特定的例子工作。但是,我想我给出的例子不够健壮。我已经更新了这个例子,它似乎没有为它工作,但它应该,因为我相信for循环只考虑第一个PID值正确?此外,我还设置了enabledelayedexpansion,它会影响代码吗? –

+0

我对代码进行了几次测试,看起来%% a在第一次迭代中占据了整行,而不是直到空间。任何想法为什么? –

+0

我看不到你的测试,但我会得出结论,你的变量是“引用” – Magoo

1

的另一种方法,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% 

缺点:需要的文件;创建一个永久的环境变量(当然可以很容易地删除)