标题: [文件操作] 在光盘上,for语句执行多个程序时,执行顺序为什么会对文件名的大小写敏感? [打印本页]
作者: killer3k 时间: 2014-5-21 20:49 标题: 在光盘上,for语句执行多个程序时,执行顺序为什么会对文件名的大小写敏感?
前些时候做了一个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语句本身就是这样规定的,还是我的代码写得有问题?
作者: CrLf 时间: 2014-5-22 00:32
会不会是虚拟光驱软件搞的鬼
作者: terse 时间: 2014-5-22 02:19
虚拟硬盘执行什么情况?
作者: 爱的温度s 时间: 2014-5-22 07:19
Office补丁的默认参数好像和Windows的不一样,能不能判断下文件属性,然后分别执行?
作者: killer3k 时间: 2014-5-22 09:26
CrLf:
电脑没光驱,再说也不可能因为这去刻张盘。所以不知道在物理光驱上运行的话是不是也是这种情况。不过我想虚拟机(vmware)的虚拟光驱加载光盘镜像的方式和直接在物理光驱上运行,两者应该差别不大吧?瞎想的。
当然如果能够在物理光驱上测试一下就好了。
terse:
虚拟硬盘和在实机硬盘上执行的情况一样,不区分大小写,直接按a、B、c、D……的顺序执行。
爱的温度s:
和文件属性无关,因为是直接从我的批处理中复制的部分代码,所以忘了去掉静默参数了。
实际上,我用若干个批处理文件测试过,使用
call "%%i"
调用的。结果一样,也是在硬盘上执行的话对大小写不敏感,在光驱上执行的话,行执行大写字母开头的文件,然后再执行小写字母开头的文件。如果文件是多个大小写混排的话,也是按顺序判断,大写“Z”永远排在小写“a”前面。
另外,是有几个补丁的静默安装参数不同,我已经按不同的文件夹分开放了。
实际上这个问题我是在无意中发现的,XP补丁中不是有一个好像与什么根证书有关的叫“rvkroots.exe”的补丁吗(注意是小写字母开头)。
因为所有的补丁文件名中都没有空格,所以写批处理时偷了一下懒,引用%%i时没有用引号。然后做成ISO镜像时又碰巧放到一个带中文的文件夹中(测试批处理时都是用的英文名的文件夹),结果执行“rvkroots.exe”时出错(这是我奇怪的另一个问题,路径中绝对没有空格,而且其它的补丁都可以执行。不知道有没有人知道是为什么?)。
出错后我就给%%i参数加了引号,然后盯着它执行(本来运行批处理后我就去干别的事了),结果一盯就盯
出这么个现象来。
反复测试后就发现了,在硬盘上执行的话,是不区分大小写的,从a-z来执行。在光驱上执行的话,就对大小写敏感,先按大写字母排序,然后按小写字母排序。
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |