批量更改文件扩展名

5

简单问题。 IMDU命令是什么?

imdu /b file.imd file.raw

并将file.imd转换为file.raw文件。

我有很多.imd文件,所以需要一个批量处理的方法。我已经尝试过:

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

但是它不能正常工作并创建了一个名为%%.raw的文件。

我需要一个批处理程序,可以删除imd扩展名并将其替换为raw。如何做到这一点?


1
对于每个 *.imd 文件,执行命令 imdu /b %%x %%~nx.raw 可以输出正确的结果。顺便说一下,我认为 IMDU 命令除了重命名之外还会进行一些额外的内容转换,不是吗? - JosefZ
2个回答

11
打开命令提示符窗口,运行for /?并仔细完整地阅读输出帮助。其中解释了%~xI——文件扩展名,以及%~nI——文件名%~nxI——带有扩展名的文件名,请注意,赋给大小写敏感的循环变量I的字符串实际上无论是一个真正存在的文件还是一个文件夹,或者根本不存在。事实上它可以是任何字符串。
使用%~nI引用的文件名是从最后一个反斜杠到最后一个点或字符串结束之间的字符串。如果分配给循环变量的字符串以反斜杠结尾,即为文件夹路径,或者文件名以点开头且没有真正的文件扩展名(如UNIX/MAC上的隐藏文件常被命名),则它可以为空字符串。
使用%~xI引用的文件扩展名是指从最后一个反斜杠后面的最后一个点到字符串末尾的所有内容,该内容被赋给循环变量。因此,%~xI引用了文件名为.htaccess的文件的文件名,而不是%~nI,在这种特殊情况下为空字符串。在UNIX/MAC上,名为.htaccess的文件实际名称为htaccess,并且在文件名开头加上.使得该文件在UNIX/MAC文件系统中被隐藏。

请注意,循环变量区分大小写,而像nxf等修饰符则不区分大小写。因此,%~NXI%~nxI相同。通常更易读的做法是将循环变量使用大写字母,将修饰符使用小写字母。

对于读者来说,有时使用既是修饰符又是循环变量的字符会导致混淆,在某些特殊情况下也可能会让cmd.exe感到困惑,例如在命令行窗口运行以下命令:

for %f in ("1. " "2. " "3. ") do @echo %~ffile

I不是一个修饰符,因此可以通过在Windows命令提示窗口中运行时使用%I代替%f来避免上述命令行输出错误:

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"

对于这样简单的循环,使用一个 ASCII 字符也是可能的,并且是一种好的做法,不使用字母或数字,对于 Windows 命令处理器没有特殊含义的字符,例如:

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

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

不要忘记在文件名周围加上双引号,因为文件名可能包含空格、圆括号或和符号,这些都需要在文件名周围加上双引号。在此用例中,命令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"

7
我建议您使用Windows Power shell来完成这个任务。但是CMD也可以正常工作。
批处理/CMD
在Windows上,转到所需目录,然后键入:
   ren *.txt *.c

.txt 是当前文件扩展名,.c 是新的扩展名。* 代表所有文件。

PowerShell

最好使用 Path.ChangeExtension 方法而不是 -replace。

   Dir *.txt | rename-item -newname { [io.path]::ChangeExtension($_.name, "c") }

这里所有扩展名为*.txt的文本文件将被更改为.name

干杯!


你有什么特别的原因推荐使用PowerShell吗?CMD命令更简单。 - swimfar2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接