Dos Batch - For Loop

时间:2011-05-10 02:08:18

标签: batch-file

任何人都可以 告诉我为什么在下面的例子中LIST的值总是空白的 我还想只在变量LIST

中检索%% i的前4个字符
cd E:\Department\Finance\edi\Japan_orders\
FOR /f %%i IN ('dir /b *.*') DO ( 

   copy %%i  E:\Department\Finance\Edi\commsfile.txt        

   set LIST=%%i
   echo %LIST%

   if %%i == FORD110509 CALL E:\Department\Finance\edi\EXTRACT.exe E:\Department\Finance\edi\COMMSFILE.TXT

)
pause

提前致谢

2 个答案:

答案 0 :(得分:2)

您需要延迟扩展。在程序开头添加以下内容:

setlocal enabledelayedexpansion

然后在循环中使用!LIST!而不是%LIST%

如需详尽说明,请阅读help set

答案 1 :(得分:2)

完全解析括号内的命令块,并在之前完成它们的执行。因此,%LIST%表达式在开头展开,而LIST变量仍为空。当执行echo %LIST%时,那里不再有%LIST%,而是只有空字符串(读:'nothing')。这就是它的工作原理(不要问我为什么)。

在这种情况下使用了延迟扩展机制,Joey已经告诉过你需要使用!LIST!而不是%LIST%的特殊语法,必须先启用它(通常是命令SETLOCAL EnableDelayedExpansion,他也提到过。

另一方面,可以从值中提取子字符串,但必须先将值存储到变量中。基本上,提取子字符串的语法是:

%VARIABLE:~offset,charcount%
%VARIABLE:~offset%

也就是说,您要指定起始位置(从0开始),并且可选地指定要从该值中剪切的字符数。 (如果省略quantity,那么你只是在偏移处切割源字符串到最后。)你可以通过从命令行发出HELP SET来阅读更多关于它的信息(等等,这是同样的命令,乔伊提到了!)。

还有一件事:不要忘记延迟扩张。您需要将上述%语法更改为!语法。在您的情况下,检索前4个字符的正确表达式为:

!LIST:~0,4!

您可以直接使用它,也可以先将其存储回LIST,然后在需要子字符串的地方使用!LIST!