我有一个批处理脚本,用于从我的游戏服务器上的日志中提取聊天行。
输入文件的文本行如下:
12/30/2015 12:42:03 : #[PLAYERNAME] Hello!
然后我处理日志的每一行以提取玩家名称,如下所示:
for /f "tokens=2 delims=[]" %%d in ("!LINE!") do (set "NAME=%%d")
如果玩家的名字中没有[]括号字符,这可以正常工作。
如果他们的名字如下所示:
12/30/2015 12:42:03 : #[<][PLAYERNAME][>] Hello!
或者类似的东西,那么我只提取小部分而不是它们的完整名称&lt;] [PLAYERNAME] [&gt;。
如何为玩家姓名可能包含的任意数量的括号制作FOR命令帐号?
任何帮助都将不胜感激。
答案 0 :(得分:1)
此方法假设玩家名称以$window.localStorage['data’]
(右方广场+空格)结尾。当然,如果玩家名称可能包含这些字符,则该方法将失败。
>java -classpath <all the libraries jars here> test.Client
输出:
"] "
答案 1 :(得分:0)
@ECHO Off
SETLOCAL
SET "sourcedir=U:\sourcedir"
SET "filename1=%sourcedir%\q34543549.txt"
FOR /f "usebackqdelims=" %%a IN ("%filename1%") DO (
SET "name=%%a"
CALL :process
)
GOTO :EOF
:process
SET "name=%name:*#=%"
:proclp1
IF "%name:~-1%" neq "]" SET "name=%name:~0,-1%"&GOTO proclp1
SET name
GOTO :EOF
您需要更改sourcedir
的设置以适合您的具体情况。
我使用了一个名为q34543549.txt
的文件,其中包含我的测试数据。
当然,如果名称字符串后的文本包含]
,则逻辑上无法解密。
答案 2 :(得分:0)
以下代码查找第一次出现的开头符号 SPACE #[
与第一次出现的结束符号]
SPACE 在game_log.txt
的每一行之后,将找到的子串作为用户名写入game_users.txt
。当然,如果用户名本身包含后一个符号,它将失败:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "INFILE=game_log.txt"
set "OUTFILE=game_users.txt"
set "LEFT= #["
set "RIGHT=] "
> "%OUTFILE%" (
for /F "usebackq delims=" %%L in ("%INFILE%") do (
set "LINE=%%L"
setlocal EnableDelayedExpansion
set "LINE=!LINE:*%LEFT%=!"
call :LEN LLEN LINE
set "REST=%RIGHT%!LINE:*%RIGHT%=!"
call :LEN RLEN REST
set /A "RPOS=LLEN-RLEN"
for /F "delims=" %%P in ("!RPOS!") do (
echo(!LINE:~,%%P!
)
endlocal
)
)
endlocal
exit /B
:LEN output input
setlocal EnableDelayedExpansion
set /A "SLEN=0"
if "%~2"=="" goto :END
set "STRING=!%~2!"
if not defined STRING goto :END
set /A "SLEN=1"
for %%I in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do (
if not "!STRING:~%%I,1!"=="" (
set /A "SLEN+=%%I"
set "STRING=!STRING:~%%I!"
)
)
:END
if "%~1"=="" (
echo(%SLEN%
endlocal
) else (
endlocal & set "%~1=%SLEN%"
)
exit /B
此脚本确定从开头符号到结尾之后开始的子字符串的长度以及包括结束符号直到结尾的子字符串,计算这些数字之间的差异并从开头符号开始后提取字符串位置。结果数字的长度。已选择此方法让脚本接受所有字符,包括特殊字符,尤其是%
,!
和"
。