批处理 - For 和 Findstr 在同一行上打印多个条件

Batch - For and Findstr with multiple criteria printed on same line

我正在尝试解析一些 xml 文件并提取一些数据。该数据与来自 API 的 Magic The Gathering 卡牌游戏卡数据有关。当我搜索一张卡片(本例中为 Goblin Warchief)时,结果如下所示:

<?xml version="1.0" encoding="utf-8"?>
<response>
  <product>
    <idProduct>1090</idProduct>
    <idMetaproduct>2459</idMetaproduct>
    <countReprints>8</countReprints>
    <enName>Goblin Warchief</enName>
    <locName>Goblin Warchief</locName>
    <localization>
      <name>Goblin Warchief</name>
      <idLanguage>1</idLanguage>
      <languageName>English</languageName>
    </localization>
    <localization>
      <name>Chef de guerre gobelin</name>
      <idLanguage>2</idLanguage>
      <languageName>French</languageName>
    </localization>
    <localization>
      <name>Goblin-Kriegsh„uptling</name>
      <idLanguage>3</idLanguage>
      <languageName>German</languageName>
    </localization>
    <localization>
      <name>Jefe de guerra trasgo</name>
      <idLanguage>4</idLanguage>
      <languageName>Spanish</languageName>
    </localization>
    <localization>
      <name>Condottiero Goblin</name>
      <idLanguage>5</idLanguage>
      <languageName>Italian</languageName>
    </localization>
    <website>/en/Magic/Products/Singles/Scourge/Goblin-Warchief</website>
    <image>./img/items/1/SCG/1090.jpg</image>
    <gameName>Magic the Gathering</gameName>
    <categoryName>Magic Single</categoryName>
    <idGame>1</idGame>
    <number>97</number>
    <rarity>Uncommon</rarity>
    <expansionName>Scourge</expansionName>
    <expansionIcon>41</expansionIcon>
    <countArticles>1524</countArticles>
    <countFoils>41</countFoils>
    <links>
      <rel>product</rel>
      <href>/products/1090</href>
      <method>GET</method>
    </links>
  </product>
  <product>
    <idProduct>15846</idProduct>
    <idMetaproduct>2459</idMetaproduct>
    <countReprints>8</countReprints>
    <enName>Goblin Warchief (Version 1)</enName>
    <locName>Goblin Warchief (Version 1)</locName>
    <localization>
      <name>Goblin Warchief</name>
      <idLanguage>1</idLanguage>
      <languageName>English</languageName>
    </localization>
    <localization>
      <name>Chef de guerre gobelin</name>
      <idLanguage>2</idLanguage>
      <languageName>French</languageName>
    </localization>
    <localization>
      <name>Goblin-Kriegsh„uptling</name>
      <idLanguage>3</idLanguage>
      <languageName>German</languageName>
    </localization>
    <localization>
      <name>Jefe de guerra trasgo</name>
      <idLanguage>4</idLanguage>
      <languageName>Spanish</languageName>
    </localization>
    <localization>
      <name>Condottiero Goblin</name>
      <idLanguage>5</idLanguage>
      <languageName>Italian</languageName>
    </localization>
    <website>/en/Magic/Products/Singles/Friday+Night+Magic+Promos/Goblin-Warchief-Version-1</website>
    <image>./img/items/1/FNM/15846.jpg</image>
    <gameName>Magic the Gathering</gameName>
    <categoryName>Magic Single</categoryName>
    <idGame>1</idGame>
    <number>2006-05</number>
    <rarity>Rare</rarity>
    <expansionName>Friday Night Magic Promos</expansionName>
    <expansionIcon>69</expansionIcon>
    <countArticles>234</countArticles>
    <countFoils>213</countFoils>
    <links>
      <rel>product</rel>
      <href>/products/15846</href>
      <method>GET</method>
    </links>
  </product>
  <product>
    <idProduct>288444</idProduct>
    <idMetaproduct>2459</idMetaproduct>
    <countReprints>8</countReprints>
    <enName>Goblin Warchief (Version 2)</enName>
    <locName>Goblin Warchief (Version 2)</locName>
    <localization>
      <name>Goblin Warchief</name>
      <idLanguage>1</idLanguage>
      <languageName>English</languageName>
    </localization>
    <localization>
      <name>Chef de guerre gobelin</name>
      <idLanguage>2</idLanguage>
      <languageName>French</languageName>
    </localization>
    <localization>
      <name>Goblin-Kriegsh„uptling</name>
      <idLanguage>3</idLanguage>
      <languageName>German</languageName>
    </localization>
    <localization>
      <name>Jefe de guerra trasgo</name>
      <idLanguage>4</idLanguage>
      <languageName>Spanish</languageName>
    </localization>
    <localization>
      <name>Condottiero Goblin</name>
      <idLanguage>5</idLanguage>
      <languageName>Italian</languageName>
    </localization>
    <website>/en/Magic/Products/Singles/Friday+Night+Magic+Promos/Goblin-Warchief-Version-2</website>
    <image>./img/items/1/FNM/288444.jpg</image>
    <gameName>Magic the Gathering</gameName>
    <categoryName>Magic Single</categoryName>
    <idGame>1</idGame>
    <number>2016-05</number>
    <rarity>Rare</rarity>
    <expansionName>Friday Night Magic Promos</expansionName>
    <expansionIcon>69</expansionIcon>
    <countArticles>1425</countArticles>
    <countFoils>1425</countFoils>
    <links>
      <rel>product</rel>
      <href>/products/288444</href>
      <method>GET</method>
    </links>
  </product>
  <product>
    <idProduct>18797</idProduct>
    <idMetaproduct>2459</idMetaproduct>
    <countReprints>8</countReprints>
    <enName>Goblin Warchief</enName>
    <locName>Goblin Warchief</locName>
    <localization>
      <name>Goblin Warchief</name>
      <idLanguage>1</idLanguage>
      <languageName>English</languageName>
    </localization>
    <localization>
      <name>Chef de guerre gobelin</name>
      <idLanguage>2</idLanguage>
      <languageName>French</languageName>
    </localization>
    <localization>
      <name>Goblin-Kriegsh„uptling</name>
      <idLanguage>3</idLanguage>
      <languageName>German</languageName>
    </localization>
    <localization>
      <name>Jefe de guerra trasgo</name>
      <idLanguage>4</idLanguage>
      <languageName>Spanish</languageName>
    </localization>
    <localization>
      <name>Condottiero Goblin</name>
      <idLanguage>5</idLanguage>
      <languageName>Italian</languageName>
    </localization>
    <website>/en/Magic/Products/Singles/Duel+Decks%3A+Elves+vs.+Goblins/Goblin-Warchief</website>
    <image>./img/items/1/EVG/18797.jpg</image>
    <gameName>Magic the Gathering</gameName>
    <categoryName>Magic Single</categoryName>
    <idGame>1</idGame>
    <number>42</number>
    <rarity>Uncommon</rarity>
    <expansionName>Duel Decks: Elves vs. Goblins</expansionName>
    <expansionIcon>88</expansionIcon>
    <countArticles>254</countArticles>
    <countFoils>0</countFoils>
    <links>
      <rel>product</rel>
      <href>/products/18797</href>
      <method>GET</method>
    </links>
  </product>
  <product>
    <idProduct>249281</idProduct>
    <idMetaproduct>2459</idMetaproduct>
    <countReprints>8</countReprints>
    <enName>Goblin Warchief</enName>
    <locName>Goblin Warchief</locName>
    <localization>
      <name>Goblin Warchief</name>
      <idLanguage>1</idLanguage>
      <languageName>English</languageName>
    </localization>
    <localization>
      <name>Chef de guerre gobelin</name>
      <idLanguage>2</idLanguage>
      <languageName>French</languageName>
    </localization>
    <localization>
      <name>Goblin-Kriegsh„uptling</name>
      <idLanguage>3</idLanguage>
      <languageName>German</languageName>
    </localization>
    <localization>
      <name>Jefe de guerra trasgo</name>
      <idLanguage>4</idLanguage>
      <languageName>Spanish</languageName>
    </localization>
    <localization>
      <name>Condottiero Goblin</name>
      <idLanguage>5</idLanguage>
      <languageName>Italian</languageName>
    </localization>
    <website>/en/Magic/Products/Singles/WCD+2003%3A+Wolfgang+Eder/Goblin-Warchief</website>
    <image>./img/items/1/WCD34/249281.jpg</image>
    <gameName>Magic the Gathering</gameName>
    <categoryName>Magic Single</categoryName>
    <idGame>1</idGame>
    <number></number>
    <rarity>Special</rarity>
    <expansionName>WCD 2003: Wolfgang Eder</expansionName>
    <expansionIcon>87</expansionIcon>
    <countArticles>35</countArticles>
    <countFoils>0</countFoils>
    <links>
      <rel>product</rel>
      <href>/products/249281</href>
      <method>GET</method>
    </links>
  </product>
  <product>
    <idProduct>268812</idProduct>
    <idMetaproduct>2459</idMetaproduct>
    <countReprints>8</countReprints>
    <enName>Goblin Warchief</enName>
    <locName>Goblin Warchief</locName>
    <localization>
      <name>Goblin Warchief</name>
      <idLanguage>1</idLanguage>
      <languageName>English</languageName>
    </localization>
    <localization>
      <name>Chef de guerre gobelin</name>
      <idLanguage>2</idLanguage>
      <languageName>French</languageName>
    </localization>
    <localization>
      <name>Goblin-Kriegsh„uptling</name>
      <idLanguage>3</idLanguage>
      <languageName>German</languageName>
    </localization>
    <localization>
      <name>Jefe de guerra trasgo</name>
      <idLanguage>4</idLanguage>
      <languageName>Spanish</languageName>
    </localization>
    <localization>
      <name>Condottiero Goblin</name>
      <idLanguage>5</idLanguage>
      <languageName>Italian</languageName>
    </localization>
    <website>/en/Magic/Products/Singles/Duel+Decks%3A+Speed+vs.+Cunning/Goblin-Warchief</website>
    <image>./img/items/1/DDN/268812.jpg</image>
    <gameName>Magic the Gathering</gameName>
    <categoryName>Magic Single</categoryName>
    <idGame>1</idGame>
    <number>9</number>
    <rarity>Uncommon</rarity>
    <expansionName>Duel Decks: Speed vs. Cunning</expansionName>
    <expansionIcon>256</expansionIcon>
    <countArticles>1198</countArticles>
    <countFoils>0</countFoils>
    <links>
      <rel>product</rel>
      <href>/products/268812</href>
      <method>GET</method>
    </links>
  </product>
  <product>
    <idProduct>270006</idProduct>
    <idMetaproduct>2459</idMetaproduct>
    <countReprints>8</countReprints>
    <enName>Goblin Warchief</enName>
    <locName>Goblin Warchief</locName>
    <localization>
      <name>Goblin Warchief</name>
      <idLanguage>1</idLanguage>
      <languageName>English</languageName>
    </localization>
    <localization>
      <name>Chef de guerre gobelin</name>
      <idLanguage>2</idLanguage>
      <languageName>French</languageName>
    </localization>
    <localization>
      <name>Goblin-Kriegsh„uptling</name>
      <idLanguage>3</idLanguage>
      <languageName>German</languageName>
    </localization>
    <localization>
      <name>Jefe de guerra trasgo</name>
      <idLanguage>4</idLanguage>
      <languageName>Spanish</languageName>
    </localization>
    <localization>
      <name>Condottiero Goblin</name>
      <idLanguage>5</idLanguage>
      <languageName>Italian</languageName>
    </localization>
    <website>/en/Magic/Products/Singles/Duel+Decks%3A+Anthology/Goblin-Warchief</website>
    <image>./img/items/1/DD3/270006.jpg</image>
    <gameName>Magic the Gathering</gameName>
    <categoryName>Magic Single</categoryName>
    <idGame>1</idGame>
    <number>2042</number>
    <rarity>Uncommon</rarity>
    <expansionName>Duel Decks: Anthology</expansionName>
    <expansionIcon>259</expansionIcon>
    <countArticles>230</countArticles>
    <countFoils>0</countFoils>
    <links>
      <rel>product</rel>
      <href>/products/270006</href>
      <method>GET</method>
    </links>
  </product>
  <product>
    <idProduct>319794</idProduct>
    <idMetaproduct>2459</idMetaproduct>
    <countReprints>8</countReprints>
    <enName>Goblin Warchief</enName>
    <locName>Goblin Warchief</locName>
    <localization>
      <name>Goblin Warchief</name>
      <idLanguage>1</idLanguage>
      <languageName>English</languageName>
    </localization>
    <localization>
      <name>Chef de guerre gobelin</name>
      <idLanguage>2</idLanguage>
      <languageName>French</languageName>
    </localization>
    <localization>
      <name>Goblin-Kriegsh„uptling</name>
      <idLanguage>3</idLanguage>
      <languageName>German</languageName>
    </localization>
    <localization>
      <name>Jefe de guerra trasgo</name>
      <idLanguage>4</idLanguage>
      <languageName>Spanish</languageName>
    </localization>
    <localization>
      <name>Condottiero Goblin</name>
      <idLanguage>5</idLanguage>
      <languageName>Italian</languageName>
    </localization>
    <website>/en/Magic/Products/Singles/Dominaria/Goblin-Warchief</website>
    <image>./img/items/1/DOM/319794.jpg</image>
    <gameName>Magic the Gathering</gameName>
    <categoryName>Magic Single</categoryName>
    <idGame>1</idGame>
    <number>130</number>
    <rarity>Uncommon</rarity>
    <expansionName>Dominaria</expansionName>
    <expansionIcon>419</expansionIcon>
    <countArticles>7370</countArticles>
    <countFoils>221</countFoils>
    <links>
      <rel>product</rel>
      <href>/products/319794</href>
      <method>GET</method>
    </links>
  </product>
  <links>
    <rel>self</rel>
    <href>/products/find?search=Goblin%20Warchief&amp;exact=true&amp;idGame=1&amp;idLanguage=1</href>
    <method>GET</method>
  </links>
</response>

因此,如您所见,任何给定的卡片搜索通常都会有多个结果。

现在,我感兴趣的是在同一行上将每个产品的和字段打印到一个单独的文件中。所以像这样:

Goblin Warchief_Scourge
Goblin Warchief (Version 1)_Friday Night Magic Promos
Goblin Warchief (Version 2)_Friday Night Magic Promos
etc

我更喜欢批量执行此操作,到目前为止,我能做到的最好的事情就是简单地分别打印 enName 和 expansionName 字段,如下所示:

@echo off

if exist searchResultFiltered.xml del searchResultFiltered.xml

rem The card name is passed in from the command line
set cardname=%~1

rem This uses an outside application to interface the API
mkm get "products/find?search=%cardname%&exact=true&idGame=1&idLanguage=1" > searchResult.xml

for /f "tokens=3 delims=<>" %%j in ('findstr "enName expansionName" "searchResult.xml"') do >> searchResultFiltered.xml echo %%j

这给出了这样的输出:

Goblin Warchief
Scourge
Goblin Warchief (Version 1)
Friday Night Magic Promos
Goblin Warchief (Version 2)
Friday Night Magic Promos
etc...

任何人都可以帮我把行 "pairs" 放在同一行上,中间有一个分隔符吗?我将不胜感激任何帮助。我不知道是否有办法用 for 和 findstr 巧妙地完成它,或者我是否需要将它们打印到新文件或其他东西。

谢谢!

 set "flag="
 for /f "tokens=3 delims=<>" %%j in ('findstr "enName expansionName" "searchResult.xml"') do (
 if defined flag (
  >> searchResultFiltered.xml call echo %%flag%% %%j&set "flag="
 ) else (set "flag=%%j")
 )

flag 初始化为 nothing.

通过 findstr 过滤器的第一个项目将 flag 视为未定义,因此 sets(因此 定义 flag 到所需的文本。

通过门的下一个项目现在将 flag 视为 定义的 因此 echo 是其值 + 子外壳中当前行的值;然后清除 flag.

冲洗并重复。

有关显示 var 当前 值的 call echo %%var%% 方法的示例,请参阅有关 delayed expansion 的许多文章。