[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文件操作] 在光盘上,for语句执行多个程序时,执行顺序为什么会对文件名的大小写敏感?

前些时候做了一个XP的补丁集,用批处理来静默安装。因为是在虚拟机中测试的,在测试中发现了一个很奇怪的问题:
假设“patch_2”文件夹下有若干文件,比如说:
a.exe
B.exe
c.exe
D.exe
e.exe
F.exe
注意:文件名有大小写的区别。

我的批处理的部分代码如下:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /r %%l in (*.exe) do (
  4. set /a b+=1
  5. )
  6. for /r patch_2 %%i in (*.exe) do (
  7.   set /a a+=1
  8.   echo 正在安装: [!a!/!b!] %%~nxi
  9.   "%%i" /quiet /norestart /nobackup
  10. )
  11. echo.
  12. echo.
  13. echo 总计!b!个补丁安装完毕,建议立即重新启动。
  14. 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语句本身就是这样规定的,还是我的代码写得有问题?

会不会是虚拟光驱软件搞的鬼

TOP

虚拟硬盘执行什么情况?

TOP

Office补丁的默认参数好像和Windows的不一样,能不能判断下文件属性,然后分别执行?

TOP

CrLf:
电脑没光驱,再说也不可能因为这去刻张盘。所以不知道在物理光驱上运行的话是不是也是这种情况。不过我想虚拟机(vmware)的虚拟光驱加载光盘镜像的方式和直接在物理光驱上运行,两者应该差别不大吧?瞎想的。
当然如果能够在物理光驱上测试一下就好了。

terse:
虚拟硬盘和在实机硬盘上执行的情况一样,不区分大小写,直接按a、B、c、D……的顺序执行。

爱的温度s:
和文件属性无关,因为是直接从我的批处理中复制的部分代码,所以忘了去掉静默参数了。
实际上,我用若干个批处理文件测试过,使用
call "%%i"
调用的。结果一样,也是在硬盘上执行的话对大小写不敏感,在光驱上执行的话,行执行大写字母开头的文件,然后再执行小写字母开头的文件。如果文件是多个大小写混排的话,也是按顺序判断,大写“Z”永远排在小写“a”前面。
另外,是有几个补丁的静默安装参数不同,我已经按不同的文件夹分开放了。

实际上这个问题我是在无意中发现的,XP补丁中不是有一个好像与什么根证书有关的叫“rvkroots.exe”的补丁吗(注意是小写字母开头)。
因为所有的补丁文件名中都没有空格,所以写批处理时偷了一下懒,引用%%i时没有用引号。然后做成ISO镜像时又碰巧放到一个带中文的文件夹中(测试批处理时都是用的英文名的文件夹),结果执行“rvkroots.exe”时出错(这是我奇怪的另一个问题,路径中绝对没有空格,而且其它的补丁都可以执行。不知道有没有人知道是为什么?)。
出错后我就给%%i参数加了引号,然后盯着它执行(本来运行批处理后我就去干别的事了),结果一盯就盯
出这么个现象来。
反复测试后就发现了,在硬盘上执行的话,是不区分大小写的,从a-z来执行。在光驱上执行的话,就对大小写敏感,先按大写字母排序,然后按小写字母排序。

TOP

返回列表