Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 如何以csv格式保存xml解析输出结果_Batch File - Fatal编程技术网

Batch file 如何以csv格式保存xml解析输出结果

Batch file 如何以csv格式保存xml解析输出结果,batch-file,Batch File,下面批处理脚本读取xml文件并提取所需的标记/值,并将它们保存在输出文件中,但问题是,所有所需的标记值都会在A列中一个接一个地保存。我希望每个标记值都存储在相应的标记头中。非常感谢您的帮助 xml输入文件内容: <RIMP> <HSI> <SN>Pro Gen8</SN> <SP>Podt1</SP> <UUID>ILD9V</UUID> <VIRTUAL> <PN>Inte

下面批处理脚本读取xml文件并提取所需的标记/值,并将它们保存在输出文件中,但问题是,所有所需的标记值都会在A列中一个接一个地保存。我希望每个标记值都存储在相应的标记头中。非常感谢您的帮助

xml输入文件内容:

<RIMP>
<HSI>
<SN>Pro Gen8</SN>
<SP>Podt1</SP>
<UUID>ILD9V</UUID>
<VIRTUAL>
<PN>Inte 4</PN>
<VID>
<BSN></BSN>
<TYPE>Admin</TYPE>
</VID>
</VIRTUAL>
<PRODUCTID> 9A          </PRODUCTID>
<NICS>
<NIC>
<PORT>1</PORT>
<MACADDR></MACADDR>
</NIC>
</RIMP>   
但我试图获得以下输出:

SN,UUID,PN,TYPE 
Pro Gen8,ILD9V,Inte 4,Admin     
使用DavidPostill代码后,我现在得到的预期输出如下:

SN,UUID,PN,TYPE 
Pro Gen8,ILD9V,Inte 4,Admin 
如何将服务器ip/info添加为csv文件的第一列(服务器信息取自serverlist文件)

David的代码实现了这一点,任何人都需要关于csv格式输出的答案,然后我建议您务必查看下面David的回复

我希望每个标记值都存储在各自的标记头中 假设您实际想要一个CSV文件作为输出,使用以下批处理文件

test.cmd

@echo off
setlocal enabledelayedexpansion
set inFile="C:\output\input.xml"
set outFile="C:\output.csv"
set req_tags=SN UUID PN TYPE
set outLine=
echo SN,UUID,PN,TYPE > %outFile% 
for %%a in (%inFile%) do (
  for %%c in (%req_tags%) do (
    set search_tag=%%c
    for /f "tokens=2 delims=><  " %%b in ('type "%%a" ^|findstr /i !search_tag!' ) do (
      if [%%b] NEQ [] (
        rem we don't want to match /BSN
        if [%%b] NEQ [/BSN] (
          set outline=!outline!%%b,
        )
      )
    )
  )
)
rem output the values
rem remove trailing ,
set outline=%outline:~0,-1%
echo %outline%>>"%outFile%"
endlocal

进一步阅读
  • -对于所有与Windows命令行相关的内容都是一个很好的参考
  • -延迟扩展将导致变量在执行时而不是在解析时扩展
  • -有条件地执行命令数次
  • -有条件地对多个文件执行命令
  • -循环命令:针对一组文件-有条件地对每个项目执行命令
  • -提取变量的一部分(子字符串)

CSV表示逗号分隔的值,但我在输出数据中看不到任何逗号
。。。您还需要向我们展示XML输入数据。。。一般来说,我推荐另一种本机支持XML解析的语言,因为像批处理文件一样将其视为普通文本非常麻烦而且容易出错……我从excel复制了输出文件内容,所以看不到逗号。我已经更新了最初的帖子,加入了xml输入文件内容。所以用文本编辑器复制CSV数据吧!aschipfl,我所做的就是获取输出,这样,当用户可以使用电子表格过滤器选项过滤结果时。很抱歉,csv可能会在此处造成混淆。我很抱歉,舒尔您不希望输出与此处显示的完全一致(查看第1列和第2列);非常漂亮,请用文本编辑器复制数据,以便清晰可见…谢谢David。你对我努力实现的目标的理解是正确的。对于您的代码,一切正常,但发现第一个req_标记值显示了两次,不知道为什么。我更新了原始帖子,以显示得到了什么输出now@Prime我无法用你问题中的测试文件重现。对不起,大卫。我的错误是,我重新运行了your代码,这次它在输出csv文件中没有重复任何第一个标记值。再次感谢。是否可以将服务器ip/info添加为csv文件中的第一个标头,因为我需要为多个服务器运行此脚本,因此,如果csv文件中没有服务器ip/info,则很难说哪行值对应于哪台服务器。我从serverlist文件中读取了服务器信息。当然这是可能的。例如,您可以添加一个额外的封装for循环,以
echo
s服务器信息。如果你被卡住了,请问一个新问题,必要时参考这个问题的上下文。只需添加一个链接(并说明添加链接的原因)。
SN,UUID,PN,TYPE 
Pro Gen8,ILD9V,Inte 4,Admin 
Server,SN,UUID,PN,TYPE 
11.12.13.14,Pro Gen8,ILD9V,Inte 4,Admin 
@echo off
setlocal enabledelayedexpansion
set inFile="C:\output\input.xml"
set outFile="C:\output.csv"
set req_tags=SN UUID PN TYPE
set outLine=
echo SN,UUID,PN,TYPE > %outFile% 
for %%a in (%inFile%) do (
  for %%c in (%req_tags%) do (
    set search_tag=%%c
    for /f "tokens=2 delims=><  " %%b in ('type "%%a" ^|findstr /i !search_tag!' ) do (
      if [%%b] NEQ [] (
        rem we don't want to match /BSN
        if [%%b] NEQ [/BSN] (
          set outline=!outline!%%b,
        )
      )
    )
  )
)
rem output the values
rem remove trailing ,
set outline=%outline:~0,-1%
echo %outline%>>"%outFile%"
endlocal
F:\test>test

F:\test>type C:\output.csv
SN,UUID,PN,TYPE
Pro Gen8,ILD9V,Inte 4,Admin

F:\test>