批量更改文件扩展名

埃尔巴纳

简单的问题。IMDU命令

imdu /b file.imd file.raw

并在file.raw上转换file.imd

我有很多.imd,所以我需要一批。我试过了:

for %%x in (*.imd) do imdu /b %%x %%~nx.raw

但是它不起作用,并创建了一个名为%%。raw的文件

我需要一批将删除扩展名imd并将其替换为raw的批处理。我怎样才能做到这一点?

莫菲

打开命令提示符窗口,for /?仔细完整地运行并阅读输出帮助。

有解释%~xI-只有文件扩展名%I-和%~nI-只有文件名%I和- %~nxI-与扩展文件名%I请注意,分配给区分大小写的循环变量的字符串I是真正存在还是根本不存在的文件或文件夹都没有关系。实际上,它可以是任何字符串。

引用文件名%~nI是最后一个反斜杠之后的字符串,直到字符串的最后一个点或末尾。如果分配给循环变量的字符串以反斜杠结尾(即,是文件夹路径),或者文件名以点开头并且没有真实的文件扩展名(如UNIX / MAC上的隐藏文件),则可以为空字符串。

引用文件扩展名%~xI是从上次反冲后的最后一个点到分配给循环变量的字符串末尾的所有内容。因此%~xI,使用诸如.htaccess的名称引用文件的文件名,%~nI在这种特殊情况下,该文件名是一个空字符串。.htaccess在UNIX / MAC上,一个名为的文件的真实名称为,htaccess并且.在文件名的开头使该文件在UNIX / MAC文件系统上隐藏。

请注意,循环变量是区分大小写的,而改良剂喜欢nxf,...是不区分大小写。因此%~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%~I被解释为引用I除去了双引号的分配给循环变量的字符串

因此,我建议避免将这些字符之一ADFNPSTXZadfnpstxz用作循环变量,或者至少在使用它们时要格外小心。

出于所有这些原因,最好在批处理文件中使用,在该文件中,必须使用以下命令行将百分号加倍:

for %%I in (*.imd) do imdu.exe /b "%%I" "%%~nI.raw"

对于这样的简单循环,也可以使用对Windows命令处理器没有特殊意义ASCII字符而不是字母或数字,这也是一种很好的做法

for %%# in (*.imd) do imdu.exe /b "%%#" "%%~n#.raw"

在批处理文件中搜索所有出现的情况#搜索在其他字符串中也多次出现的字母的出现情况容易得多。该字符$也非常适合作为循环变量,因为它也没有特殊含义,并且通常不存在于批处理文件的其他字符串中。

不要忘记在文件名两边加上双引号,因为文件的文件名中可能包含空格,圆括号或“&”号,这需要在文件名两边加上双引号。在这种用例中,命令FOR保留一个文件名,该文件名始终在循环变量中不包含双引号。

另一个提示:

使用FOR处理与通配符模式匹配的文件或文件夹,这些文件或文件夹在FOR迭代中被执行的命令行重命名,移动或删除,在FAT32和exFAT驱动器上存在问题,因为目录条目的更改列表,而FOR在访问过程中会访问此列表循环迭代。

例如,下面的批处理文件中的命令行(当前目录位于FAT32exFAT驱动器上)可能导致一个临时文件被重命名多次。

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"

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章