批量更改文件扩展名

时间:2016-05-14 22:08:42

标签: windows batch-file command-line batch-rename

简单的问题。 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 怎么办?

2 个答案:

答案 0 :(得分:5)

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

%~xI仅解释了%I - 仅文件扩展名 - %~nI - 仅{em>文件名 {{1} }和%I - 文件名,扩展名为 %~nxI。请注意,分配给区分大小写的循环变量%I的字符串实际上是文件还是真正存在或根本不存在的文件夹无关紧要。实际上它可以是任何字符串。

I引用的文件名是最后一个反斜杠到最后一个点或字符串结尾之后的字符串。如果分配给循环变量的字符串以反斜杠结尾,即文件夹路径,或者文件名以点开头,并且没有像UNIX / MAC上的隐藏文件那样的真实文件扩展名,则它可以是空字符串。< / p>

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

请注意,循环变量区分大小写,而.nx等修饰符不区分大小写。因此f%~NXI相同。通常使用大写的循环变量和小写的修饰符更好的可读性。

对于读者来说可能会让人感到困惑,在某些特殊情况下也会让%~nxI混淆使用作为循环变量的字符,这也是一个修饰符,例如在cmd窗口中运行命令行: / p>

cmd.exe

for %f in ("1. " "2. " "3. ") do @echo %~ffile 不是修饰符,因此可以使用I而不是%I来避免上面命令行的错误输出,因为在Windows命令提示符下运行时可以看到窗口:

%f

现在很清楚,for %I in ("1. " "2. " "3. ") do @echo %~Ifile 被解释为对分配给循环变量%~ff的字符串的完全限定文件名的引用,而f被解释为引用分配给循环变量的字符串{删除了双引号的{1}}。

所以我建议避免使用其中一个字符%~I作为循环变量,或者至少要小心使用它们。

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

I

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

ADFNPSTXZadfnpstxz

在批处理文件中搜索所有出现的for %%I in (*.imd) do imdu.exe /b "%%I" "%%~nI.raw" 比在其他字符串中多次出现的字母更容易。字符for %%# in (*.imd) do imdu.exe /b "%%#" "%%~n#.raw" 作为循环变量也非常好,因为它也没有特殊含义,并且通常不存在于批处理文件的其他字符串中。

不要忘记文件名周围的双引号,因为文件的文件名中可能包含空格或圆括号或&符号,这些文件名需要双引号。命令 FOR 在此用例中保存了一个文件名,在循环变量中始终没有包含双引号。

还有一个提示:

使用 FOR 来处理与通配符模式匹配的文件或文件夹,这些文件或文件夹由 FOR 迭代上执行的命令行重命名,移动或删除是有问题的由于目录条目更改列表,FAT32和exFAT驱动器,而 FOR 在循环迭代期间访问此列表。

例如,当前目录位于 FAT32 exFAT 驱动器的批处理文件中的下面的命令行可能导致临时文件被重命名多次。< / p>

#

在这种情况下,最好在批处理文件命令 DIR 中使用,以获取 FOR 捕获的文件名列表,该列表现在处理文件名列表而不是由 FOR 在每个文件名上执行的命令行修改,如下所示。

$

答案 1 :(得分:2)

我建议您使用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

干杯!