2016-10-04 64 views
0

在每個循環中,我試圖在除第一個迭代之外的每個迭代上執行任務。這是我嘗試首次聲明後,變量拒絕設置爲不同的值

@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 ...

  • 如何將first的值更改爲零?
  • 有沒有更好的方法來制定一個條件來檢查迭代是否爲而不是第一個?

乾杯

編輯:

這是當前輸出

1 
1 

回答

3

要設置擴大(讀取)的同一行或塊內的變量代碼,所以你需要delayed expansion。否則,%first%將展開爲在整個行/塊被解析時變量設置爲的值(因此變量實際上設置爲,但讀取的是舊值)。要使用延遲擴展,請將%first%替換爲!first!

然而,由於正在使用的變量作爲一個布爾標誌只,可以反映通過一個空的變量的布爾假,而不是由值0,所以可以使用if not defined first代替if !first!==0,其延遲擴展是沒有必要用於:

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

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