第一次声明后,变量拒绝设置为不同的值

时间:2016-10-04 11:21:48

标签: windows loops batch-file

在每个循环中,我尝试在除第一个循环之外的每个迭代上执行任务。这是我的尝试

@echo off

set sources=file1.txt file2.txt
set output=output.txt
set comment_prefix=--

break>%output%
setlocal EnableDelayedExpansion

set first=1
for %%a in (%sources%) do (
    if %first%==0 (
        echo.>> %output%
        echo.>> %output%
        echo.>> %output%
    )
    set first=0
    echo %first%

    echo %comment_prefix%>>%output% %%a
    echo.>> %output%
    type %%a>>%output%
)

问题是变量first似乎经常设置为1,即使它在第一次迭代后应该设置为0(我认为)...... / p>

  • 如何将first的值更改为零?
  • 是否有更好的方法来制定条件来检查迭代是否第一个?

干杯

修改

这是当前的输出

1
1

1 个答案:

答案 0 :(得分:3)

您正在设置扩展(读取)同一行或代码块中的变量,因此您需要delayed expansion。否则,%first%将扩展到解析整个行/块时变量设置为的值(因此变量实际上是设置,但读取旧值) 。要使用延迟展开,请将%first%替换为!first!

但是,由于您仅将变量用作布尔标志,因此您可以通过空变量而不是值0来反映布尔值False,因此您可以使用if not defined first代替{ {1}},延迟扩展不是必需的:

if !first!==0