■前言
今天实现业务功能时,写了类似如下,第一个循环中的代码,
@setlocal enabledelayedexpansion @echo off cd /d C: est emp tree /F /A dir /b /s C: est emp*.txt echo ==================== for /f %%I in ('dir /b /s C: est emp*66*.txt') do ( set fileName=%%I set fileRename=%fileName:66=-66% echo sss%fileName% for /f "tokens=2 delims=-" %%i in ('echo %fileRename%') do echo %%i ) rem enable delayed expansion echo ==================== for /f %%I in ('dir /b /s C: est emp*66*.txt') do ( set fileName=%%I set fileRename=!fileName:66=-66! echo sss!fileName! for /f "tokens=2 delims=-" %%i in ('echo !fileRename!') do ( set codeNumber=%%i echo !codeNumber:~0,6! ) ) pause
■问题
却发现,变量没有像我期待的那样出力结果,
只是,输出了三行「sss」
也就是说,所有的变量值,都是空值
卷 Windows 的文件夹 PATH 列表 卷序列号为 B274-C2AD C:. | test.bat | testFor.bat | testStr.bat | +---123 | 新建文本文档 (2).txt | 新建文本文档6.txt | +---456 | 22.txt | 新建文本文档661002.txt | ---789 sfss661005test01.txt 新建文本文档 (2).txt 新建文本文档661003.txt C: est emp123新建文本文档 (2).txt C: est emp123新建文本文档6.txt C: est emp45622.txt C: est emp456新建文本文档661002.txt C: est emp789sfss661005test01.txt C: est emp789新建文本文档 (2).txt C: est emp789新建文本文档661003.txt ==================== sss sss sss ==================== sssC: est emp456新建文本文档661002.txt 661002 sssC: est emp789sfss661005test01.txt 661005 sssC: est emp789新建文本文档661003.txt 661003 请按任意键继续. . .
■原因
为什么会有这个问题,因为在for循环被当作一行代码来处理了,for循环内部定义的变量不能被识别。
■解决
使用延期变量扩展
・在代码的最上面 加上 @setlocal enabledelayedexpansion
・变量的引用,使用叹号