批处理脚本。分割特殊字符串(< =>)并将其解压缩。 (XML到EXCEL)怎么样?

时间:2017-04-21 03:13:01

标签: xml windows batch-file scripting

有一个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

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

只有在读取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地址。 请帮忙。谢谢

1 个答案:

答案 0 :(得分:0)

@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的设置以适合您的具体情况。

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

生成定义为%outfile%

的文件

阅读提名角色的文件和标记。

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

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

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

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

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

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