2014-12-20 2 views
-1

У меня проблема с моей партией. XMLStarlet не показывает мне полную строку.XMLStarlet не печатает полную строку

Однако, я получаю пакетный файл ниже только 3DS, а остальная часть строки не отображается.

Вывод должен быть только версией с первой строки title, содержащей 3DS в XML-файле, например. 9.4.0-21 без 3DS.

Я был бы очень рад любому ответу.

Мой командный файл:

@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:

<?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> 

Отступы являются горизонтальными символами табуляции. Есть 2 вкладки, оставшиеся до <title>3DS 9.4.0-21</title>.

ответ

0

Вот командный код, чтобы получить информацию о версии от первого названия тега, начиная с 3DS из XML файла:

@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, назначенный рядом с переменной окружения FirmwareVersion3DS.

Для этой цели представляет интерес только первая строка с информацией о версии. Таким образом, цикл выходит с переходом для вывода найденной информации о версии после обработки первой строки, возвращаемой командой findstr.

Сообщение об ошибке выводится вместо информации о версии, если произошла ошибка, например XML-файл, из-за отсутствия подключения к веб-серверу или синтаксиса в файле XML, измененного тем временем.

Нет чека, если токен 3 действительно ссылается на информацию о версии.Поэтому код пакетного файла должен быть обновлен, если, например, пробелы вместо вкладок выводятся скриптом PHP на сервере для отступов строк.

Код партии удаляет файл XML перед его загрузкой с сервера, чтобы избежать синтаксического анализа старого XML-файла. Файл XML и используемая переменная среды также удаляются перед выходом из командного файла только для того, чтобы оставить чистую среду обратно.


EDIT:

Строка с командой для может быть также

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 теперь содержит строку интерес к выпуску.

Это решение лучше первого, так как это не имеет значения, если строка с версией имеет отступы с пробелами или вкладками или вообще не имеет отступов.

Смежные вопросы