2014-12-20 46 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-現在包含字符串對產出感興趣。

該解決方案比第一個更好,因爲如果版本字符串的行與空格或製表符縮進或根本沒有縮進,則該解決方案已無關緊要。