前些时候做了一个XP的补丁集,用批处理来静默安装。因为是在虚拟机中测试的,在测试中发现了一个很奇怪的问题:
假设“patch_2”文件夹下有若干文件,比如说:
a.exe
B.exe
c.exe
D.exe
e.exe
F.exe
注意:文件名有大小写的区别。
我的批处理的部分代码如下:- @echo off
- setlocal enabledelayedexpansion
-
- for /r %%l in (*.exe) do (
- set /a b+=1
- )
-
- for /r patch_2 %%i in (*.exe) do (
- set /a a+=1
- echo 正在安装: [!a!/!b!] %%~nxi
- "%%i" /quiet /norestart /nobackup
-
- )
- echo.
- echo.
- echo 总计!b!个补丁安装完毕,建议立即重新启动。
- pause
复制代码 假如将patch_2文件夹及批处理拷贝到硬盘上执行的话,执行顺序将会是:
a.exe
B.exe
c.exe
D.exe
e.exe
F.exe
按文件名从小到大的顺序来执行,文件名是不是大小写都没有影响。
假如将patch_2文件夹及批处理制成ISO镜像,然后加载到虚拟机的光驱来执行的话,执行顺序将会是:
B.exe
D.exe
F.exe
a.exe
c.exe
e.exe
执行顺序是先按从小到大的顺序执行大写字母开头的文件,等所有大写字母开头的文件执行完毕后,才按从小到大的顺序执行小写字母开头的文件。
为什么从硬盘执行的话,for语句对大小写就不敏感,从光驱执行的话,就会对大小写敏感呢?
是for语句本身就是这样规定的,还是我的代码写得有问题? |