在批处理文件中分支程序输出

时间:2012-02-20 11:06:32

标签: windows batch-file

我一直被困在这个问题上,在帮助网站上查看如何批量编程只会让我更加困惑。

上下文是我想识别文件夹中哪些文件是xml有效,并将所有无效文件附加到特定文件以供进一步处理。

这样做我正在使用xmlstarlet并使用下面的命令我已经能够识别哪些是有效的并将输出传输到我的批处理文件。

xml val *.xml | myscript.bat

现在,我想要做的是确定哪些是有效的,为了做到这一点,我需要解析xml.exe的输出,如下所示:

20100319.xml - valid
20090915.xml - valid
20090915.xml - valid
20090915.xml - valid
20090915.xml - invalid

所以我真正需要的是在每一行上分支以查看最后7个字符是否“无效”,如果是,则将xml文件附加到我的结果文件中。

尝试这样做我构建了您将在下面找到的脚本。

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

for /F "tokens=*" %%a in ('more') do (
 set full=%%a
 set /p prefix=!full:~-7!
 if %prefix% == "invalid" (type %%a result.xml) else (echo "valid file")
)

现在我首先要弄清楚我的问题

(type was unexpected at this time.

然后,如果我删除if分支并将其替换为echo %prefix%,我会得到此输出:

- validECHO is off.
- validECHO is off.
- validECHO is off.
- validECHO is off.
invalidECHO is off.

你能帮我创建一个分支,将xml文件附加到我的结果文件中并摆脱ECHO关闭吗?打开@ECHO off,导致将代码本身打印到屏幕上。

感谢您的帮助!

亚历

2 个答案:

答案 0 :(得分:1)

jeb在评论中诊断并解决了您的问题(只要您将>result.xml更改为>>result.xml)。 Alex K.答案很好,但只有在你可以保证文件名不包含空格的情况下它才会起作用。

但是有一个更简单,更快速的解决方案:使用FINDSTR过滤“xml.exe”的结果,只保留以“invalid”结尾的行。我认为将输出文件命名为result.xml并不是一个好主意,因为内容不是xml格式。我将输出文件重命名为“invalidXML.txt”。

xml val *.xml | findstr /e "invalid" >invalidXML.txt

以上假设“xml.exe”生成以<CR><LF>终止的有效Windows样式行。如果不是这种情况,并且“xml.exe”生成以<Lf>终止的unix样式行,则使用MORE转换为Windows样式。

xml val *.xml | more | findstr /e "invalid" >invalidXML.txt

获取可以使用的有效文件列表(如果需要,再次添加更多)

xml val *.xml | findstr /e "- valid" >validXML.txt

上面保留了每行末尾的“ - invalid”或“ - valid”指示符,原始代码(一旦调试)也是如此。它无需批处理文件即可运行:)

如果您想要像Alex K.建议的那样输出(仅限文件名),那么您将回到使用FOR循环,最好在批处理文件中。我将xml.exe验证迁移到FOR循环中。如果需要,您可以恢复将结果传送到批处理中。即使文件名中有空格,此解决方案也能正常工作。我使用EOL=:以防文件名以;开头,极不可能,但可能。

@echo off
setlocal enableDelayedExpansion
for /f "eol=: delims=" %%A in ('xml val *.xml') do (
  set "ln=%%A"
  if "!ln:~-7!" == "invalid" (>>invalidXML.txt echo !ln:0,~-10!) else echo !ln:0,~-8! is valid
)

如果文件名包含!,则由于延迟扩展,该名称将被set "ln=%%A"损坏。修复方法是在循环中打开和关闭延迟扩展

@echo off
setlocal disableDelayedExpansion
for /f "eol=: delims=" %%A in ('xml val *.xml') do (
  set "ln=%%A"
  setlocal enableDelayedExpansion
  if "!ln:~-7!" == "invalid" (>>invalidXML.txt echo !ln:0,~-10!) else echo !ln:0,~-8! is valid
  end local
)

答案 1 :(得分:0)

由于模式为“FILENAME - RESULT”,您可以使用FOR循环拆分空白区域,以便%%a=FILENAME%%B=-%%C=RESULT < / p>

for /F "tokens=1,2,3 delims= " %%a in ('more') do (
    if "%%c" neq "valid" (
        echo %%a is invalid [%%c]
        echo %%a >> result.xml
    ) else (
        echo %%a is valid
    )
)

不确定type %%a result.xml,我认为这不是一个有效的命令。

echo %%a >> result.xml会将文件名附加到result.xml