如何在批处理脚本中包含或循环

时间:2019-06-07 13:23:24

标签: batch-file

我正在尝试将我的编译结果写入一个文件夹:如果存在一种文件类型(file1或file2),则表示我的编译成功。我想将此结果报告为txt文件

我尝试使用布尔值来做一个标志,但是它不起作用。我解析我的文件夹,并在每个输出/ NameofaRun中,我正在寻找是否有file1或file2。

for /D %%X in (%1\*) do (
    set flag = 0
    if exist %%X\OUTPUT\%2\file1.txt ( flag = 1)
    if exist %%X\OUTPUT\%2\file2.txt ( flag = 1)
    if %flag% ==  1 ( echo %%X>>%3\Compilation_Check.txt Succeeded )
    if %flag% == 0 (
        echo %%X>>%3\Compilation_Check.txt Failed Warning
        )
)

我想在“ compilation_check.txt”中写入我的txt结果。并且我正在运行该批处理,并将文件夹路径/文件夹名称作为参数

1 个答案:

答案 0 :(得分:1)

您的逻辑是正确的;没有几个细节...

  • set命令将等号之前的所有字符(包括空格)作为变量名。您应该使用set flag=0,或者最好使用set "flag=0"
  • 方便将文件名放在引号之间,以避免任何名称可能包含空格的问题。
  • 更改set的值时错过了flag命令。
  • 当变量值在(block) 中更改时,无法通过%var%访问新值,而是使用!var!语法并包括{{1 }}在程序开头的命令。关于这一点,有很多详细的解释。寻找“延迟扩展”。

这是您先前修改过的代码:

setlocal EnableDelayedExpansion

但是,我会这样:

setlocal EnableDelayedExpansion

for /D %%X in (%1\*) do (
    set "flag=0"
    if exist "%%X\OUTPUT\%2\file1.txt" ( set "flag=1" )
    if exist "%%X\OUTPUT\%2\file2.txt" ( set "flag=1" )
    if !flag! == 1 ( echo %%X Succeeded  >> "%3\Compilation_Check.txt")
    if !flag! == 0 (
        echo %%X Failed Warning  >> "%3\Compilation_Check.txt"
        )
)

您没有使用for /D %%X in (%1\*) do ( set "anyFile=" if exist "%%X\OUTPUT\%2\file1.txt" set "anyFile=1" if exist "%%X\OUTPUT\%2\file2.txt" set "anyFile=1" (if defined anyFile ( echo %%X Succeeded ) else ( echo %%X Failed Warning )) >> "%3\Compilation_Check.txt" ) 变量的flag命令允许检查变量是否存在;该“技巧”可以避免延迟扩展问题...

您可以将几个命令括在if defined中,以便将所有命令的输出重定向到同一文件...