批处理脚本。分割一个特殊的字符串(<=>)并提取它。 (XML到EXCEL)如何?

问题描述:

有一个xml文件,我想使用批处理脚本将其提取到excel文件中。批处理脚本。分割一个特殊的字符串(<=>)并提取它。 (XML到EXCEL)如何?

文字:

<TableCell width="20" class="normal">10.0.0.1</TableCell> 
    <Paragraph>5900/tcp</Paragraph></TableCell> 
<TableCell width="20" class="normal">10.0.0.1</TableCell> 
    <Paragraph>139/tcp</Paragraph></TableCell> 
<TableCell width="20" class="normal">10.0.0.2</TableCell> 
    <Paragraph>445/tcp</Paragraph></TableCell> 
<TableCell width="20" class="normal">10.0.0.3</TableCell> 
    <Paragraph>139/tcp</Paragraph></TableCell> 
<TableCell width="20" class="normal">10.0.0.3</TableCell> 
    <Paragraph>445/tcp</Paragraph></TableCell> 
<TableCell width="20" class="normal">10.0.0.2</TableCell> 
    <Paragraph>443/tcp</Paragraph></TableCell> 
<TableCell width="20" class="normal">10.0.0.3</TableCell> 
    <Paragraph>1311/tcp</Paragraph></TableCell> 
<TableCell width="20" class="normal">10.0.0.1</TableCell> 
    <Paragraph>1443/tcp</Paragraph></TableCell> 
<TableCell width="20" class="normal">10.0.0.4</TableCell> 
    <Paragraph>443/tcp</Paragraph></TableCell> 

代码,我已经问世至今,仍停留在分裂的一部分,因为有错误

代码:

@ECHO OFF 
SET LOCAL 

SET "file=C:\Users\Intern3\Downloads\Nmap\Nex\1.txt" 

FOR /F "usebackq tokens=1-4 delims=^>" %%a IN ("%file%") DO (
echo %%a %%b 
CALL :process %%a %%b) 

GOTO :eof 

:process 
echo %* 
pause 
ECHO %*|FIND "class" > NUL 
IF NOT ERRORLEVEL 1 GOTO ip 

GOTO :eof 

:ip 
FOR /F "tokens=* delims=^=" %%b IN (%*) DO (
pause 
ECHO %%b, %%c, %%d) 

GOTO :eof 

现在有在代码中回声,因为我想看看错误在哪里。

错误只在读取IP地址时出现。但是对于港口来说一切都是找到的。

错误:

The system cannot find the file width 

输出被假设是这样

示例输出:

10.0.0.1 
5900/tcp 
139/tcp 
1443/tcp 

10.0.0.2 
445/tcp 
443/tcp 

10.0.0.3 
139/tcp 
1311/tcp 
445/tcp 

10.0.0.4 
443/tcp 

应该输出。但我仍然坚持分裂IP地址。 请帮忙。谢谢

+3

*我使用的绝对是错误的工具,而且我遇到了问题。请帮助!*为什么你要在批处理文件中执行此操作? Excel将直接导入XML,并且使用VBA字符串函数和循环遍历单元可以更轻松地处理它,而不是使用批处理文件。不要试图用锤子做手术。 –

@ECHO OFF 
SETLOCAL 
SET "sourcedir=U:\sourcedir" 
SET "destdir=U:\destdir" 
SET "filename1=%sourcedir%\q43533312.txt" 
SET "outfile=%destdir%\outfile.txt" 
:: make a tempfile 
:maketemp 
SET "tempfile=%temp%\%random%" 
IF EXIST "%tempfile%*" GOTO maketemp 
COPY NUL "%tempfile%a" >nul 

(
FOR /f "usebackqtokens=1-7delims=<=> " %%a IN ("%filename1%") DO (

IF /i "%%a%%g"=="Tablecell/Tablecell" SET ip=%%f 
IF /i "%%a%%c"=="Paragraph/Paragraph" CALL :record %%b 

) 
)>"%tempfile%a" 

SET "ip=" 

(
FOR /f "delims=" %%a IN ('sort "%tempfile%a"') DO CALL :report %%a 
)>"%outfile%" 
DEL "%tempfile%a" 
GOTO :EOF 

:record 

FOR /f "tokens=1-4delims=." %%p IN ("%ip%") DO (
SET /a ip1=1000+%%p 
SET /a ip2=1000+%%q 
SET /a ip3=1000+%%r 
SET /a ip4=1000+%%s 
) 
FOR /f "tokens=1-2delims=/" %%p IN ("%1") DO (
SET /a port1=1000000+%%p 
SET /a port2=%%q 
) 

ECHO %ip1%%ip2%%ip3%%ip4% %port1%%port2% %ip% %1 

GOTO :eof 

:report 
IF "%ip%"=="%3" GOTO dataline 
IF DEFINED ip ECHO. 
SET "ip=%3" 
ECHO %ip% 

:dataline 
ECHO %4 
GOTO :eof 

你需要改变的sourcedirdestdir设置以适合你的情况。

我使用了一个名为的文件,其中包含我的测试数据。

主要生产定义为%OUTFILE%

阅读提名字符的文件和tokenise文件。

对于第一个和第七个标记为tablecell对的行,请将ip设置为第六个标记。对于那些第一个和第三个是另一个对,请致电:record例程传递第二个标记中的文本。

:record例程令牌ip使用.,并将1000添加到每个元素。由于每个元素必须是0..255,因此它提供了一组数字,它们是1000..1255,因此它们的长度都是相同的。

同样,在/的第一个参数中拆分字符串,并向第一个元素添加一个大数字,以便任何值都将生成一个恒定长度的字符串。

通过echo ing将计算出的元素与原始源数据一起输出。主线中的控制for包含在括号中并重定向将将数据发送到临时文件。

最后,对tempfile进行排序并用每行内容调用:report。参数3中ip的变化意味着IP需要在其自己的行上输出;如果它是第一个,则ip将不会被设置(在for/f调用sort之前被清除)意味着不会生成新行作为第一行。

然后在第四个参数中显示端口数据。