打开命令提示符窗口,运行for /?
并仔细完整地阅读输出帮助。
有说明%~xI
– only 文件扩展名 of %I
– and %~nI
– only 文件名 of %I
– and %~nxI
– 带扩展名的文件名 of %I
。请注意,分配给区分大小写的循环变量的字符串并不重要I
是真正存在或根本不存在的文件或文件夹。事实上它可以是任何字符串。
The 文件名参考与%~nI
是最后一个反斜杠之后到最后一个点或字符串末尾的字符串。如果分配给循环变量的字符串以反斜杠结尾,即是文件夹路径,或者文件名以点开头并且没有真正的文件扩展名(如 UNIX/MAC 上的隐藏文件通常被命名),则它可以是空字符串。
The 文件扩展名参考与%~xI
是从最后一个反冲后的最后一个点到分配给循环变量的字符串末尾的所有内容。所以%~xI
引用名称类似的文件的文件名.htaccess
并不是%~nI
在这种特殊情况下,它是一个空字符串。一个名为.htaccess
在 UNIX/MAC 上,文件的真实名称是htaccess
and .
文件名开头的 使该文件隐藏在 UNIX/MAC 文件系统上。
请注意,循环变量区分大小写,而修饰符如n
, x
, f
, ... 不区分大小写。所以%~NXI
与%~nxI
。一般来说,使用大写的循环变量和小写的修饰符具有更好的可读性。
这可能会让读者感到困惑,在某些特殊情况下也会让读者感到困惑。cmd.exe
使用同时也是修饰符的字符作为循环变量意味着什么,例如在 cmd 窗口中运行命令行:
for %f in ("1. " "2. " "3. ") do @echo %~ffile
I
不是修饰符,因此可以使用以下命令避免上面命令行的错误输出%I
代替%f
在 Windows 命令提示符窗口中运行时可以看到:
for %I in ("1. " "2. " "3. ") do @echo %~Ifile
现在很清楚%~ff
被解释为对分配给循环变量的字符串的完全限定文件名的引用f
while %~I
被解释为引用分配给循环变量的字符串I
删除双引号。
所以我建议避免使用这些字符之一ADFNPSTXZadfnpstxz
作为循环变量,或者至少在使用它们时要小心。
出于所有这些原因,最好在批处理文件中使用以下命令行,其中百分号必须加倍:
for %%I in (*.imd) do imdu.exe /b "%%I" "%%~nI.raw"
对于这种简单的循环,使用ASCII字符不是字母或数字,对于 Windows 命令处理器没有特殊含义,例如:
for %%# in (*.imd) do imdu.exe /b "%%#" "%%~n#.raw"
在批处理文件中搜索所有出现的情况更容易#
比在其他字符串中也多次出现的字母的所有出现要多。人物$
作为循环变量也非常好,因为它也没有特殊含义,并且通常不存在于批处理文件中的其他字符串中。
不要忘记文件名周围的双引号,因为文件名中可能包含空格或圆括号或与号,这需要文件名周围的双引号。命令FOR在此用例中,循环变量中始终保留文件名而不用双引号引起来。
还有一个提示:
的用法FOR处理与通配符模式匹配的文件或文件夹,这些文件或文件夹通过执行的命令行重命名、移动或删除FORFAT32 和 exFAT 驱动器上的迭代存在问题,因为目录条目列表发生了更改FOR在循环迭代期间访问此列表。
例如,批处理文件中的以下命令行当前目录位于FAT32 or exFAT驱动器可能会导致临时文件被多次重命名。
for %%# in (*.tmp) do ren "%%#" "%%~n#_1.tmp"
在这种情况下,最好在批处理文件中使用命令DIR获取捕获的文件名列表FOR现在处理未由执行的命令行修改的文件名列表FOR每个文件名如下所示。
for /F "eol=| delims=" %%# in ('dir *.tmp /A-D /B /ON 2^>nul') do ren "%%#" "%%~n#_1.tmp"