批处理脚本:解析文本会产生完全意外的输出,缺少变量值

时间:2013-08-22 16:43:51

标签: batch-file cmd

情景:

我正在尝试重新格式化应用程序的输出(Wpkg,命令wpkg.js /query:a)。我仅限于标准的命令行工具。

命令输出包含重复的软件包标题块及其参数,即:

Mozilla Firefox
    ID:                mozilla-firefox
    Revision:          23.0.1.1
    Reboot:            false
    Execute:           -
    Priority:          100
    Status:            Installed


Mozilla Thunderbird
    ID:                mozilla-thunderbird
    Revision:          17.0.8.1
    Reboot:            false
    Execute:           -
    Priority:          100
    Status:            Installed

这使得长输出难以阅读。我也不需要所有的信息。

因此,我正在尝试为每个块收集一个变量中的有趣信息,然后我将在一行中输出,得到如下结果:

Mozilla Firefox             mozilla-firefox          23.0.1.1     Installed
Mozilla Thunderbird         mozilla-thunderbird      17.0.8.1     Installed

问题:

为实现这一点,我首先使用以下代码解析输出:

rem Split all lines into two tokens

@for /f "tokens=1,2" %%G IN ('%WPKG_CMD% /query:a') DO @(

rem With first token, check what to do:
rem I can get known strings (Store, Ignore)
rem or I can get package name (NewLine)

@set WpkgListAll_ToDo=NewLine

@if [%%G]==[ID:]        set WpkgListAll_ToDo=Store
@if [%%G]==[Revision:]  set WpkgListAll_ToDo=Store
@if [%%G]==[Reboot:]    set WpkgListAll_ToDo=Ignore
@if [%%G]==[Execute:]   set WpkgListAll_ToDo=Ignore
@if [%%G]==[Priority:]  set WpkgListAll_ToDo=Ignore
@if [%%G]==[Status:]    set WpkgListAll_ToDo=Store

rem Echo for debug purpose

@echo [%%G][%WpkgListAll_ToDo%]

rem Next follows some unimportant code

)

从上面的代码我完全期望以下调试输出:

[Mozilla][NewLine]
[Revision:][Store]
[Reboot:][Ignore]
[Execute:][Ignore]
[Priority:][Ignore]
[Status:][Store]
[Mozilla][NewLine]
[ID:][Store]
[Revision:][Store]
[Reboot:][Ignore]
[Execute:][Ignore]
[Priority:][Ignore]
[Status:][Store]

我得到的是......:

[Mozilla][]
[Revision:][]
[Reboot:][]
[Execute:][]
[Priority:][]
[Status:][]
[Mozilla][]
[ID:][]
[Revision:][]
[Reboot:][]
[Execute:][]
[Priority:][]
[Status:][]

......我一直在努力理解为什么,但我失败了。

问题:

任何人都可以解释为什么输出会让我失望,我该怎么做才能做到正确?

1 个答案:

答案 0 :(得分:3)

您必须使用延迟变量扩展。首先,在开头添加setlocal enabledelayedexpansion行,在脚本末尾添加endlocal。然后将echo语句更改为:

@echo [%%G][!WpkgListAll_ToDo!]`