有一个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地址。 请帮忙。谢谢
答案 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
您需要更改sourcedir
和destdir
的设置以适合您的具体情况。
我使用了一个名为q43533312.txt
的文件,其中包含我的测试数据。
生成定义为%outfile%
的文件阅读提名角色的文件和标记。
对于第一个和第七个令牌为tablecell
对的行,请将ip
设置为第六个令牌。对于那些第一个和第三个是另一个对的人,调用:record
例程传递第二个标记中的文本。
:record
例程使用ip
对.
进行标记,并为每个元素添加1000。由于每个元素必须为0..255,因此它提供了一组1000..1255的数字,因此它们的长度都相同。
同样,在/
的第一个参数中拆分字符串,并在第一个元素中添加一个大数字,这样任何值都将产生一个恒定长度的字符串。
通过echo
输出计算出的元素和原始源数据。主线中的控制for
括在括号中并重定向的事实将数据发送到临时文件。
最后,对tempfile进行排序,并使用每行的内容调用:report
。参数3中ip
的变化意味着IP需要在自己的行上输出;如果它是第一个,ip
将不会被设置(它在for/f
调用sort
之前被清除)意味着不会产生新行作为第一行。
然后在第四个参数中显示端口数据。