【问题标题】:Batch Scripting. Spliting a special string(<=>) and extracting it. (XML to EXCEL)How?批处理脚本。拆分特殊字符串(<=>)并提取它。 (XML转EXCEL)如何?
【发布时间】:2017-09-17 21:38:19
【问题描述】:

有一个 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地址。 请帮忙。谢谢

【问题讨论】:

  • 我使用的工具绝对是错误的,我遇到了问题。请帮忙!您为什么要在批处理文件中执行此操作? Excel 将直接导入 XML,与使用批处理文件相比,使用 VBA 字符串函数和循环单元格可以更轻松地使用它。别再试图用锤子做手术了。

标签: xml windows batch-file scripting


【解决方案1】:
@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,因此它们的长度都是相同的。

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-17
    • 1970-01-01
    相关资源
    最近更新 更多