我具有以下文件,通过在文件名末尾添加xxx.001
来修改xxx.002
,.txt
等。为此,我使用以下命令:
rename XXXX*.* *?.txt
但是,它两次插入.txt
,而不是一次。
一种解决方案是使用FOR循环重命名与通配符模式匹配的文件。
for %%I in (xxx*) do ren "%%I" "%%I.txt"
批处理文件中的此FOR循环”在当前目录中搜索文件名与通配符模式xxx*
匹配的非隐藏文件。每个与通配符模式匹配的文件名都分配给循环变量I
,而没有文件路径,也没有双引号,即使包含空格或这些字符之一&()[]{}^=;!'+,`~
要求将文件名用双引号引起来也是如此。命令REN通过附加.txt
重命名文件。
此简单命令行的问题在于,当命令FOR遍历与通配符模式匹配的文件名列表时,当前目录中的文件名列表会更改。但是,此命令行在NTFS格式的存储介质上仍可以工作,因为NTFS以本地特定字母顺序存储目录条目,并且由于某些文件名仅附加了.txt
,因此当前目录中文件名的类别不会更改。但是在FAT16,FAT32或ExFAT格式的存储介质上,此简单的命令行可能无法按预期工作。由于FAT驱动器上的目录条目未像NTFS驱动器上那样进行排序存储,因此某些文件可能会多次重命名,而另一些文件可能会被跳过。
解决方案是先获取要重命名到内存中的文件列表,然后依次重命名。然后,文件名列表在循环迭代期间不再更改。这可以通过以下命令行来实现:
在后台运行,另外一个命令进程以for /F "eol=| delims=" %%I in ('dir "xxx*" /A-D /B 2^>nul') do ren "%%I" "%%I.txt"
在这种情况下,带有选项/F
的FOR
%ComSpec% /c
开始,并在'
之间指定了附加的命令行。这意味着在Windows安装到C:\Windows
的情况下,FOR在后台执行:之前执行嵌入的[ C0]在后台启动的单独命令过程中的命令行。<< [DIR由C:\Windows\System32\cmd.exe /c dir "xxx*" /A-D /B 2>nul
阅读有关Using Command Redirection Operators的Microsoft文章,以获取
2>nul
的解释。当Windows命令解释器在执行命令[[FOR
>
在后台搜索中执行在当前目录中
对于由于选项^
而导致的非隐藏文件和隐藏文件的文件名(属性而非目录)dir
匹配,即以cmd.exe
开头的任何文件名,/A-D
从未包含在xxx*
中。xxx
自身终止后逐行处理。这是与第一个命令行的重要区别。文件名列表现在完全在内存中了,FOR遍历此文件名列表,在循环迭代期间不再更改。FOR和选项"
会忽略在捕获的文件名列表中不存在的空行。
/B
的FOR将使用水平制表符和普通空格作为字符串定界符将每一行分成子字符串。如果文件名包含一个或多个空格,则在此不需要行拆分行为。因此,在选项参数字符串的末尾使用cmd.exe
来定义一个空的定界符列表,这将完全禁用行分割行为。如果行拆分后的第一个子字符串(在这种情况下不执行)以分号作为第一个字符,则带有选项/F
的FOR
将忽略整行。文件名可以以/F
开头,因此delims=
用于将竖线定义为行尾字符,该文件名中不能包含任何文件。因此,FOR不会忽略任何文件名。在这种情况下,DIR
仅输出以/F
开头的文件名,也可以使用默认的;
,因此不需要eol=|
。因此FOR
在DIR的另一输出之后分配一个文件名,而没有循环变量xxx
的路径,并运行命令REN通过附加eol=;
重命名该文件。 >但是如果当前目录已经包含以eol=|
开头并且具有文件扩展名I
的文件,则还有一个问题,因为这些文件也将由DIR
输出,并因此由FOR]处理>导致再追加一个.txt
。至少有两种解决方案,以避免重命名已经具有文件扩展名xxx
的文件:命令DIR的输出用 FINDSTR.txt
结尾的所有文件名:
.txt
附加的[IF
.txt
进行比较,以确定是否应使用以下命令在当前文件上执行REN:.txt
打开for /F "eol=| delims=" %%I in ('dir "xxx*" /A-D /B 2^>nul ^| %SystemRoot%\System32\findstr.exe /E /L /I /V /C:".txt"') do ren "%%I" "%%I.txt"
窗口,在其中执行以下命令,并非常仔细地阅读每个命令显示的所有帮助页面,以获取有关所用命令及其选项的更多信息。
.txt
for /F "eol=| delims=" %%I in ('dir "xxx*" /A-D /B 2^>nul') do if /I not "%%~xI" == ".txt" ren "%%I" "%%I.txt"
command promptdir /?
findstr /?