找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 127|回复: 4

[文本处理] 遇到一个循环问题,似乎@echo off 和 setlocal在循环中失效,这是怎么回事呢?

[复制链接]
发表于 2026-3-6 17:44:36 | 显示全部楼层 |阅读模式
做了一个循环计算程序,按照年份和月份进行数据组合,下面的程序在2017年循环的时候,没有任何问题,但是到2018的时候,似乎@echo off 和setlocal enabledelayedexpansion失效了,结果参数不能传递,而且所有过程都显示出来(本应该echo off的)。正确结果的2017年结果显示在下面。
而且2018年错误结果也显示出来,也附在后面。请高手给查看一下,我找了很长时间觉得没有任何错误呀,找不出问题在哪里。

@echo off
setlocal enabledelayedexpansion

for %%i in (export,import) do (

for /L %%a in (2017,1,2023) do (

REM ------interative in months-------------------------------
(for /L %%b in (1,1,12) do (
set str=0%%b
set str1=!str:~-2!

set folder=%%a!str1!

if exist !folder!\!folder!_%%i_std.har (
echo !folder!\!folder!_%%i_std.har
) else if not exist !folder!\!folder!_%%i_std.har (
md !folder!
copy zero_for_fill.har !folder!\!folder!_%%i_std.har
echo !folder!\!folder!_%%i_std.har
)
))>temp.inp

REM --------combining all years data----------------------
type temp.inp|find /v /c "" >temp.txt
set /p numb=<temp.txt

echo. >cmb_%%a_%%i.inp
echo !numb! >>cmb_%%a_%%i.inp
type temp.inp >>cmb_%%a_%%i.inp
echo all_year_data\%%a_%%i.har >>cmb_%%a_%%i.inp

cmbhar<cmb_%%a_%%i.inp
if errorlevel 1 pause

REM ----------end of months-------------------------
)
)
上面是程序部分,下面是2017年正确结果,以及2018年错误结果的附件。
正确的的2017年cmb_2017_export.inp,如下:
12
201701\201701_export_std.har
201702\201702_export_std.har
201703\201703_export_std.har
201704\201704_export_std.har
201705\201705_export_std.har
201706\201706_export_std.har
201707\201707_export_std.har
201708\201708_export_std.har
201709\201709_export_std.har
201710\201710_export_std.har
201711\201711_export_std.har
201712\201712_export_std.har
all_year_data\2017_export.har

但是,2018年就完全错误了,但是不应该出现这个问题的,所有过程都显示进去,似乎echo off 和setlocal完全失效了,请高手看一下,错误结果如下:

!numb!

G:\Trade_V_Q\values\rawdata\agri_specific_data2>(
set str=01  
set str1=!str:~-2!  
set folder=2018!str1!  
if exist !folder!\!folder!_export_std.har (echo !folder!\!folder!_export_std.har )  else if not exist !folder!\!folder!_export_std.har (
md !folder!  
copy zero_for_fill.har !folder!\!folder!_export_std.har   
echo !folder!\!folder!_export_std.har
)
)
!folder!\!folder!_export_std.har

G:\Trade_V_Q\values\rawdata\agri_specific_data2>(
set str=02  
set str1=!str:~-2!  
set folder=2018!str1!  
if exist !folder!\!folder!_export_std.har (echo !folder!\!folder!_export_std.har )  else if not exist !folder!\!folder!_export_std.har (
md !folder!  
copy zero_for_fill.har !folder!\!folder!_export_std.har   
echo !folder!\!folder!_export_std.har
)
)
!folder!\!folder!_export_std.har

G:\Trade_V_Q\values\rawdata\agri_specific_data2>(
set str=03  
set str1=!str:~-2!  
set folder=2018!str1!  
if exist !folder!\!folder!_export_std.har (echo !folder!\!folder!_export_std.har )  else if not exist !folder!\!folder!_export_std.har (
md !folder!  
copy zero_for_fill.har !folder!\!folder!_export_std.har   
echo !folder!\!folder!_export_std.har
)
)
!folder!\!folder!_export_std.har

G:\Trade_V_Q\values\rawdata\agri_specific_data2>(
set str=04  
set str1=!str:~-2!  
set folder=2018!str1!  
if exist !folder!\!folder!_export_std.har (echo !folder!\!folder!_export_std.har )  else if not exist !folder!\!folder!_export_std.har (
md !folder!  
copy zero_for_fill.har !folder!\!folder!_export_std.har   
echo !folder!\!folder!_export_std.har
)
)
!folder!\!folder!_export_std.har

G:\Trade_V_Q\values\rawdata\agri_specific_data2>(
set str=05  
set str1=!str:~-2!  
set folder=2018!str1!  
if exist !folder!\!folder!_export_std.har (echo !folder!\!folder!_export_std.har )  else if not exist !folder!\!folder!_export_std.har (
md !folder!  
copy zero_for_fill.har !folder!\!folder!_export_std.har   
echo !folder!\!folder!_export_std.har
)
)
!folder!\!folder!_export_std.har

G:\Trade_V_Q\values\rawdata\agri_specific_data2>(
set str=06  
set str1=!str:~-2!  
set folder=2018!str1!  
if exist !folder!\!folder!_export_std.har (echo !folder!\!folder!_export_std.har )  else if not exist !folder!\!folder!_export_std.har (
md !folder!  
copy zero_for_fill.har !folder!\!folder!_export_std.har   
echo !folder!\!folder!_export_std.har
)
)
!folder!\!folder!_export_std.har

G:\Trade_V_Q\values\rawdata\agri_specific_data2>(
set str=07  
set str1=!str:~-2!  
set folder=2018!str1!  
if exist !folder!\!folder!_export_std.har (echo !folder!\!folder!_export_std.har )  else if not exist !folder!\!folder!_export_std.har (
md !folder!  
copy zero_for_fill.har !folder!\!folder!_export_std.har   
echo !folder!\!folder!_export_std.har
)
)
!folder!\!folder!_export_std.har

G:\Trade_V_Q\values\rawdata\agri_specific_data2>(
set str=08  
set str1=!str:~-2!  
set folder=2018!str1!  
if exist !folder!\!folder!_export_std.har (echo !folder!\!folder!_export_std.har )  else if not exist !folder!\!folder!_export_std.har (
md !folder!  
copy zero_for_fill.har !folder!\!folder!_export_std.har   
echo !folder!\!folder!_export_std.har
)
)
!folder!\!folder!_export_std.har

G:\Trade_V_Q\values\rawdata\agri_specific_data2>(
set str=09  
set str1=!str:~-2!  
set folder=2018!str1!  
if exist !folder!\!folder!_export_std.har (echo !folder!\!folder!_export_std.har )  else if not exist !folder!\!folder!_export_std.har (
md !folder!  
copy zero_for_fill.har !folder!\!folder!_export_std.har   
echo !folder!\!folder!_export_std.har
)
)
!folder!\!folder!_export_std.har

G:\Trade_V_Q\values\rawdata\agri_specific_data2>(
set str=010  
set str1=!str:~-2!  
set folder=2018!str1!  
if exist !folder!\!folder!_export_std.har (echo !folder!\!folder!_export_std.har )  else if not exist !folder!\!folder!_export_std.har (
md !folder!  
copy zero_for_fill.har !folder!\!folder!_export_std.har   
echo !folder!\!folder!_export_std.har
)
)
!folder!\!folder!_export_std.har

G:\Trade_V_Q\values\rawdata\agri_specific_data2>(
set str=011  
set str1=!str:~-2!  
set folder=2018!str1!  
if exist !folder!\!folder!_export_std.har (echo !folder!\!folder!_export_std.har )  else if not exist !folder!\!folder!_export_std.har (
md !folder!  
copy zero_for_fill.har !folder!\!folder!_export_std.har   
echo !folder!\!folder!_export_std.har
)
)
!folder!\!folder!_export_std.har

G:\Trade_V_Q\values\rawdata\agri_specific_data2>(
set str=012  
set str1=!str:~-2!  
set folder=2018!str1!  
if exist !folder!\!folder!_export_std.har (echo !folder!\!folder!_export_std.har )  else if not exist !folder!\!folder!_export_std.har (
md !folder!  
copy zero_for_fill.har !folder!\!folder!_export_std.har   
echo !folder!\!folder!_export_std.har
)
)
!folder!\!folder!_export_std.har
all_year_data\2018_export.har
发表于 2026-3-6 22:48:04 | 显示全部楼层
失效了就重新打开。
  1. @echo off
  2. for %%i in (export,import) do (
  3.         for /L %%a in (2017,1,2023) do (
  4.                 setlocal enabledelayedexpansion
  5.                 (for /L %%b in (1,1,12) do (
  6.                         set str=0%%b
  7.                         set str1=!str:~-2!
  8.                         set folder=%%a!str1!
  9.                         echo !folder!\!folder!_%%i_std.har
  10.                         if not exist !folder!\!folder!_%%i_std.har (
  11.                                 md !folder!
  12.                                 copy zero_for_fill.har !folder!\!folder!_%%i_std.har 1>nul
  13.                         )
  14.                         set /a numb+=1
  15.                 ))>temp.inp

  16.                 > cmb_%%a_%%i.inp (
  17.                         echo !numb!
  18.                         type temp.inp
  19.                         echo all_year_data\%%a_%%i.har
  20.                 )

  21.                 cmbhar<cmb_%%a_%%i.inp
  22.                 if errorlevel 1 pause
  23.                 endlocal
  24.                 @echo off
  25.         )
  26. )
  27. pause
复制代码
 楼主| 发表于 2026-3-6 23:09:08 | 显示全部楼层
我在程序中,调整了if not exist等判断语句后面后的执行语句,将之前写入括号内的,改为用&&进行链接,解决了问题。下面是正确运行的程序:

@echo off
setlocal enabledelayedexpansion

if exist *.txt del *.txt

for /L %%a in (2017,1,2023) do (

for %%i in (export,import) do (

(for /L %%b in (1,1,12) do (
set str=0%%b
set str1=!str:~-2!

set folder=%%a!str1!

if exist !folder!\!folder!_%%i_std.har echo !folder!\!folder!_%%i_std.har
if not exist !folder! md !folder!
if not exist !folder!\!folder!_%%i_std.har copy zero_for_fill.har !folder!\!folder!_%%i_std.har >nul && echo !folder!\!folder!_%%i_std.har
))>%%a_%%i.txt

REM -----combining data---------------------
type %%a_%%i.txt |find /c /v "" >temp.txt
set /p numb=<temp.txt

(
echo.
echo !numb!
type %%a_%%i.txt
echo all_%%a_%%i.har
)>cmb_%%a_%%i.inp

cmbhar<cmb_%%a_%%i.inp
if errorlevel 1 pause
)

)
)
 楼主| 发表于 2026-3-6 23:47:21 | 显示全部楼层
回复 2# 77七


   一般而言,什么情况下会导致这种情况?我在前面的尝试中,也尝试在循环更靠内部的循环加入setlocal,但是也未解决问题。我再试一试
发表于 2026-3-7 00:52:15 | 显示全部楼层
回复 4# delab-1


   看起来是1楼的代码中的第三方程序导致了这个问题,把第三方程序的命令,替换为 echo on和endlocal,和1楼的结果一致。你测试2楼代码,仍存在相同问题吗?这种问题很少见的,见到了再解决就行。
发表于 2026-3-7 15:37:59 | 显示全部楼层
回复 1# delab-1

一楼代码缩写如下,同时删除了以下两行
   cmbhar<cmb_%%a_%%i.inp
   if errorlevel 1 pause
运行后全部结果无误。楼主若删除一楼代码这两行再试,结果如何?...

  1. @echo off &setlocal enabledelayedexpansion
  2. if not exist zero_for_fill.har cd.>zero_for_fill.har
  3. for %%i in (export,import) do for /L %%a in (2017,1,2019) do (
  4.   (for /L %%b in (1,1,12) do (
  5.     set str=0%%b
  6.     set str1=!str:~-2!
  7.     set folder=%%a!str1!
  8.     if not exist !folder! md !folder!
  9.     if exist !folder!\!folder!_%%i_std.har (
  10.       echo,!folder!\!folder!_%%i_std.har
  11.     ) else (
  12.       copy zero_for_fill.har !folder!\!folder!_%%i_std.har>nul
  13.       echo,!folder!\!folder!_%%i_std.har
  14.     )
  15.   ))>temp.inp
  16.   REM --- combining all years data
  17.   (for /f %%n in ('find /c /v ""^<temp.inp') do echo,%%n
  18.    type temp.inp
  19.    echo,all_year_data\%%a_%%i.har
  20.   )>cmb_%%a_%%i.inp
  21. )
  22. del temp.inp, zero_for_fill.har &pause&exit/b
复制代码
 楼主| 发表于 2026-3-8 09:38:03 | 显示全部楼层
回复 6# aloha20200628

多谢多谢,我等会测试一下,同时再比较查一下原因!
发表于 2026-3-8 12:38:12 | 显示全部楼层
回复 7# delab-1

一楼代码的二值逻辑 if exist ... else if not exist ... 结果都会写出 !folder!\!folder!_%%i_std.har 这一行,故输出文件 temp.inp 一定是12行,因此6楼代码(已删除未知文件 cmbhar 相关行)还可简化如下,不用临时文件...

  1. @echo off &setlocal enabledelayedexpansion &set m=12
  2. if not exist zero_for_fill.har cd.>zero_for_fill.har       
  3. for %%i in (export,import) do for /L %%a in (2017,1,2019) do (
  4.   echo,%m%
  5.   for /L %%b in (1,1,%m%) do (
  6.     set str=0%%b
  7.     set str1=!str:~-2!
  8.     set folder=%%a!str1!
  9.     if not exist !folder! md !folder!
  10.     if exist !folder!\!folder!_%%i_std.har (
  11.       echo,!folder!\!folder!_%%i_std.har
  12.     ) else (
  13.       copy zero_for_fill.har !folder!\!folder!_%%i_std.har>nul
  14.       echo,!folder!\!folder!_%%i_std.har
  15.     )
  16.   )
  17.   REM --- combining all years data
  18.   echo,all_year_data\%%a_%%i.har
  19. )>cmb_%%a_%%i.inp
  20. pause&exit/b
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-16 20:03 , Processed in 0.019641 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表