■前言
今天实现业务功能时,写了类似如下,第一个循环中的代码,
@setlocal enabledelayedexpansion
@echo off
cd /d C:\test\temp\
tree /F /A
dir /b /s C:\test\temp\*.txt
echo ====================
for /f %%I in ('dir /b /s C:\test\temp\*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:\test\temp\*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:\test\temp\123\新建文本文档 (2).txt
C:\test\temp\123\新建文本文档6.txt
C:\test\temp\456\22.txt
C:\test\temp\456\新建文本文档661002.txt
C:\test\temp\789\sfss661005test01.txt
C:\test\temp\789\新建文本文档 (2).txt
C:\test\temp\789\新建文本文档661003.txt
====================
sss
sss
sss
====================
sssC:\test\temp\456\新建文本文档661002.txt
661002
sssC:\test\temp\789\sfss661005test01.txt
661005
sssC:\test\temp\789\新建文本文档661003.txt
661003
请按任意键继续. . .
■原因
为什么会有这个问题,因为在for循环被当作一行代码来处理了,for循环内部定义的变量不能被识别。
■解决
使用延期变量扩展
・在代码的最上面 加上 @setlocal enabledelayedexpansion
・变量的引用,使用叹号