将第二文件扩展名添加到具有特定前缀的文件中

问题描述 投票:0回答:1

我具有以下文件,通过在文件名末尾添加xxx.001来修改xxx.002.txt等。为此,我使用以下命令:

rename XXXX*.* *?.txt

但是,它两次插入.txt,而不是一次。

windows batch-file cmd file-rename
1个回答
0
投票

一种解决方案是使用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在后台执行:
C:\Windows\System32\cmd.exe /c dir "xxx*" /A-D /B 2>nul

阅读有关Using Command Redirection Operators的Microsoft文章,以获取2>nul的解释。当Windows命令解释器在执行命令[[FOR

之前执行嵌入的[ C0]在后台启动的单独命令过程中的命令行。<< [DIR>在后台搜索中执行

在当前目录中

对于由于选项^而导致的非隐藏文件和隐藏文件的文件名(属性而非目录)
    与通配符模式dir匹配,即以cmd.exe开头的任何文件名,
  • 并且以纯格式输出文件名+文件扩展名,而没有文件路径,因为选项/A-D从未包含在xxx*中。
  • 如果未找到任何符合这些标准来处理
  • STDERR
  • 的目录条目,则由[[DIR
输出的错误消息将重定向到设备
  • NUL
  • 以对其进行抑制。

    的输出(用于处理后台命令过程的STDOUT)由FOR捕获,并在启动xxx自身终止后逐行处理。这是与第一个命令行的重要区别。文件名列表现在完全在内存中了,FOR遍历此文件名列表,在循环迭代期间不再更改。

    FOR和选项"会忽略在捕获的文件名列表中不存在的空行。

    带有选项/BFOR将使用水平制表符和普通空格作为字符串定界符将每一行分成子字符串。如果文件名包含一个或多个空格,则在此不需要行拆分行为。因此,在选项参数字符串的末尾使用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
    1. 附加的[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 prompt
  • dir /?

    findstr /?

    © www.soinside.com 2019 - 2024. All rights reserved.