2017-11-11 232 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% 

缺點:需要的文件;創建一個永久的環境變量(當然可以很容易地刪除)