2015-02-10 126 views

回答

2

您可以將文件評估爲XML並輸出每個葉節點的nodeValue

@if (@CodeSection == @Batch) @then 

@echo off 
setlocal 

set "xmlfile=test.xml" 

@cscript /nologo /e:JScript "%~f0" "%xmlfile%" & goto :EOF 

@end 

var xmlDoc = WSH.CreateObject('Microsoft.XMLDOM'), 
    fso = WSH.CreateObject('scripting.filesystemobject'), 
    xmlFile = fso.OpenTextFile(WSH.Arguments(0), 1); 

xmlDoc.loadXML('<root>' + xmlFile.ReadAll() + '</root>'); 

xmlFile.Close(); 
xmlDoc.async = false; 

if (xmlDoc.parseError.errorCode) { 
    var myErr = xmlDoc.parseError; 
    WSH.Echo(myErr.reason); 
} else { 
    function walker(node) { 
     for (var nodes=node.childNodes, i=0; i<nodes.length; i++) { 
      if (nodes[i].hasChildNodes) { 
       walker(nodes[i]); 
      } else { 
       WSH.Echo(nodes[i].nodeValue); 
      } 
     } 
    } 
    walker(xmlDoc.documentElement); 
} 
+0

這個工作更好,但我不明白的代碼。 java代碼如何從批處理工作? – houngtze 2015-02-10 17:28:49

+0

它是JScript。這是一個混合腳本。批處理將第一行評估爲false並繼續到下一行。當批處理線程到達'cscript'行時,腳本將重新評估爲JScript。 JScript將第一行評估爲false並跳到'@ end'。當JScript到達腳本的末尾時,它將控制返回到批處理。由於批處理中的下一條指令是「goto:EOF」,因此批處理腳本結束。 [見本頁](https://gist.github.com/davidruhmann/5199433)查看混合批處理腳本的更多示例。 – rojo 2015-02-10 17:31:44

+0

你好rojo。其他我的問題也有jscript,但是是不同的:http://stackoverflow.com/questions/28410139/batch-file-to-delete-files-older-than-n-hours-or-minutes?謝謝 – houngtze 2015-02-10 18:45:28

3
@ECHO OFF 
SETLOCAL 
(
FOR /f "delims=" %%a IN (q28433530.txt) DO (
SET "line=%%a" 
CALL :process 
) 
)>newfile.txt 
GOTO :EOF 

:process 

:procloop 
FOR /f "tokens=1,2,3*delims=<>" %%i IN ("%line%") DO IF "%%j" neq "" ECHO(%%j&IF "%%l" neq "" SET "line=%%l"&GOTO procloop 

GOTO :EOF 

我用了一個包含您的數據,我的測試命名爲q28433530.txt文件。

主要生產newfile.txt

這可能會做你看起來是想要的,provied你已經給了我們現實的代表性數據。

+0

+1我想過要做這樣的事情,但決定解決刮擦問題。刮刮無聊。但你的無聊比我的會更無聊。我喜歡你的解決方案,在一行上遞歸多個標籤。但是,警告:帶有根標籤和/或部分的有效XML將導致「ECHO關閉」行。結束於'newfile.txt'。 – rojo 2015-02-10 16:34:10

+0

@rojo:固定... – Magoo 2015-02-10 16:39:42