2014-12-20 44 views
-1

我的批处理有问题。 XMLStarlet不会显示完整的行。XMLStarlet不会全行打印

但是,我只得到下面的批处理文件3DS,其余的行不显示。

输出应该只由含有3DS在XML文件中的第一title标记线,例如版本信息9.4.0-21没有3DS

我会很高兴回答任何问题。

我的批处理文件:

<?xml version="1.0" encoding="ISO-8859-1" ?> 
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"> 
    <channel> 
     <title>Sysupdate Reports</title> 
     <atom:link href="http://yls8.mtheall.com/ninupdates/feed.php" rel="self" type="application/rss+xml" /> 
     <link>http://yls8.mtheall.com/ninupdates/reports.php</link> 
     <description>Nintendo System Update Reports</description> 
     <lastBuildDate>Thu, 11 Dec 2014 23:05:04 +0000</lastBuildDate> 
     <language>en</language> 
     <sy:updatePeriod>hourly</sy:updatePeriod> 
     <sy:updateFrequency>1</sy:updateFrequency> 
     <item> 
     <title>3DS 9.4.0-21</title> 
     <link><![CDATA[http://yls8.mtheall.com/ninupdates/reports.php?date=12-11-14_07-05-04&sys=ctr]]></link> 
     <guid isPermaLink="true"><![CDATA[http://yls8.mtheall.com/ninupdates/reports.php?date=12-11-14_07-05-04&sys=ctr]]></guid> 
     <description>3DS 9.4.0-21</description> 
     <pubDate>Thu, 11 Dec 2014 23:05:04 +0000</pubDate> 
    </item> 
    <item> 
     <title>3DS 9.3.0-21 (stage5)</title> 
     <link><![CDATA[http://yls8.mtheall.com/ninupdates/reports.php?date=12-08-14_07-45-04&sys=ctr]]></link> 
     <guid isPermaLink="true"><![CDATA[http://yls8.mtheall.com/ninupdates/reports.php?date=12-08-14_07-45-04&sys=ctr]]></guid> 
     <description>3DS 9.3.0-21 (stage5)</description> 
     <pubDate>Mon, 08 Dec 2014 23:45:03 +0000</pubDate> 
    </item> 
    <item> 
     <title>3DS 9.3.0-21 (stage4)</title> 
     <link><![CDATA[http://yls8.mtheall.com/ninupdates/reports.php?date=12-08-14_07-35-04&sys=ctr]]></link> 
     <guid isPermaLink="true"><![CDATA[http://yls8.mtheall.com/ninupdates/reports.php?date=12-08-14_07-35-04&sys=ctr]]></guid> 
     <description>3DS 9.3.0-21 (stage4)</description> 
     <pubDate>Mon, 08 Dec 2014 23:35:03 +0000</pubDate> 
    </item> 
    <item> 
     <title>3DS 9.3.0-21 (stage3)</title> 
     <link><![CDATA[http://yls8.mtheall.com/ninupdates/reports.php?date=12-08-14_07-25-04&sys=ctr]]></link> 
     <guid isPermaLink="true"><![CDATA[http://yls8.mtheall.com/ninupdates/reports.php?date=12-08-14_07-25-04&sys=ctr]]></guid> 
     <description>3DS 9.3.0-21 (stage3)</description> 
     <pubDate>Mon, 08 Dec 2014 23:25:04 +0000</pubDate> 
    </item> 
</channel> 
</rss> 

缩进与水平制表符:

@echo off 
cls 
echo. 
echo. 
echo ----------- Nintendo 3DS Firmware Checker -------------------------------------- 
echo --------------------- A CMD based Tool ----------------------------------------- 
echo. 
echo. 
echo. 
httpget http://yls8.mtheall.com/ninupdates/feed.php nintendo3dsupdate.xml 
for /f %%i in ('XML.EXE sel -t -v "//channel/item/title" "nintendo3dsupdate.xml"') do set "var111=%%i" >nul 
echo. 
echo. 
echo    "%var111%" is the currently 3ds firmware. 
echo. 
echo. 
pause 
exit 

XML文件nintendo3dsupdate.xml的内容。有2个选项卡留给<title>3DS 9.4.0-21</title>

回答

0

这里是批处理代码从第一冠军标签从XML文件开始3DS版本信息:

@echo off 
cls 
echo. 
echo. 
echo ----------- Nintendo 3DS Firmware Checker -------------------------------------- 
echo --------------------- A CMD based Tool ----------------------------------------- 
echo. 
echo. 
echo. 
del "%TEMP%\nintendo3dsupdate.xml">nul 2>nul 
set FirmwareVersion3DS= 
httpget http://yls8.mtheall.com/ninupdates/feed.php "%TEMP%\nintendo3dsupdate.xml" 
for /F "usebackq tokens=3 delims=< " %%V in (`%SystemRoot%\System32\findstr.exe "<title>3DS" "%TEMP%\nintendo3dsupdate.xml" 2^>nul`) do (
    set "FirmwareVersion3DS=%%V" 
    goto OutputInfo 
) 
echo Failed to determine version of 3DS firmware! 
echo. 
goto :EndBatch 

:OutputInfo 
echo. 
echo. 
echo    "%FirmwareVersion3DS%" is the current 3DS firmware. 
echo. 
echo. 
set FirmwareVersion3DS= 

:EndBatch 
del "%TEMP%\nintendo3dsupdate.xml">nul 2>nul 
pause 

的XML文件首先解析由命令findstr搜索简单的文本字符串<title>3DS返回

 <title>3DS 9.4.0-21</title> 
     <title>3DS 9.3.0-21 (stage5)</title> 
     <title>3DS 9.3.0-21 (stage4)</title> 
     <title>3DS 9.3.0-21 (stage3)</title> 

那些4行每个缩进2个选项卡直接重定向到命令for使用左角括号和空格字符作为分隔符分隔每行。因此第一行被分割到:

  • 令牌1:                (两个水平制表符)
  • 令牌2:title>3DS
  • 令牌3:9.4.0-21
  • 令牌4:/title>

作为只是版本号码感兴趣,只是令牌被分配给循环变量V分配给环境变量固件版本3DS

对于这个任务,只有版本信息的第一行是感兴趣的。因此,在处理由命令findstr返回的第一行之后,循环退出并跳转以输出找到的版本信息。

如果因为没有连接到Web服务器而导致没有XML文件发生错误,或者XML文件中的语法同时发生更改,则会输出错误消息而不是版本信息。

如果令牌3真的引用了版本信息,则不会进行检查。因此,如果在服务器上用于缩进行的PHP脚本输出空格而不是制表符,则必须更新批处理文件代码。

批处理代码在从服务器下载之前删除XML文件,以避免解析旧的XML文件。在退出批处理文件之前,XML文件和使用的环境变量也被删除,只是为了让干净的环境恢复。


编辑:

与命令线为可能是也

for /F "usebackq tokens=2 delims=< " %%V in (`%SystemRoot%\System32\findstr.exe "<title>3DS" "nintendo3dsupdate.xml" 2^>nul`) do (

有3个字符delims=后:

  1. 角撑架<
  2. 水平制表符(不是浏览器显示的空格序列)
  3. 单个空格字符。

定界符字符的顺序很重要,否则命令行解释程序会由于语法错误而退出批处理脚本。

此修改会忽略缩进选项卡。因此现在第一线被分解为:

  • 令牌1:title>3DS
  • 令牌2:9.4.0-21
  • 令牌3:/title>

和令牌代替3-现在包含字符串对产出感兴趣。

该解决方案比第一个更好,因为如果版本字符串的行与空格或制表符缩进或根本没有缩进,则该解决方案已无关紧要。