批量添加额外后缀的文件

files with extra suffix in batch

我正在尝试列出所有在扩展名后有额外后缀的文件 例如:.txt.1 或 .txt.2 等..

我正在使用 txt.,但它给出了所有文件名,而不仅仅是带有额外后缀的文件

for %%A in (*txt.*) do (call :renum "%%A")

在此之后,我正在编写我的程序以相应地重命名文件。 有人可以检查并提供帮助吗?

一种解决方案是在循环内按扩展名过滤:

FOR %%A IN (*txt.*) DO (
    IF NOT "%%~xA"==".txt" CALL :renum "%%A"
)

这通过使用 "enhanced substitution of FOR variable references" 来实现,在本例中为 %%~xA。您可以通过执行 FOR /?.

获得所有可用替换的概览

更新:

  • 此解决方案不区分大小写,因为既没有明确要求也没有禁止。如果需要不区分大小写,请使用 IF /I 而不是普通的 IF
  • 正如 dbenham 所指出的,存在一些边缘情况:
    • name.txt.txt 不会被处理。如果没关系没有明确说明,但很有可能。
    • name_txt.ext 将被处理,这是由于给定的通配符 *txt.* 造成的,可以通过使用 *.txt.* 来避免。我一开始不更改它的理由是只有 OP 知道他的实际文件集,我认为他有选择它的理由(这种情况在这类问题中很常见)。

您可以像这样使用两个嵌套的 for 循环:

rem // Corrected file pattern (added a `.`):
for %%A in ("*.txt.*") do (
    rem // Check (last) file extension:
    if /I not "%%~xA"==".txt" (
        rem // Remove (last) file extension:
        for %%B in ("%%~nA") do (
            rem // Check next-to-last file ext.:
            if /I "%%~xB"==".txt" (
                call :renum "%%~A"
            )
        )
    )
)

根据 for 的帮助(在命令提示符 window 中键入 for /?),for 变量的 ~x 修饰符检索文件扩展名(这是最后一个点 . 以及之后的所有内容)。 ~n 修饰符检索除文件扩展名以外的所有内容,因此检索文件(基本)名称。上面的代码使用两个嵌套的 for 循环来获取最后一个和倒数第二个文件扩展名,并根据 .txt 检查它们(以不区分大小写的方式)。

请注意,对于以 .txt.txt.

结尾的文件,不会执行 call 命令行

我会将 FINDSTR 与 DIR /B 和 FOR /F 一起使用

以下将处理带有任意数量额外扩展名的名称,例如 name.txt.extname.txt.ext.ext 等。这包括 name.txt.txt

这样的名称
for /f "delims= eol=:" %%F in (
  'dir /b /a-d *.txt.*^|findstr /i "\.txt\."'
) do call :renum "%%F"

此变体将只处理带有单个额外扩展名的名称,例如 name.txt.ext(包括 name.txt.txt

for /f "delims= eol=:" %%F in (
  'dir /b /a-d *.txt.*^|findstr /i "\.txt\.[^.]*$"'
) do call :renum "%%F"

您也可以查看我的 JREN.BAT regular expression file renaming utility。它可能可以一步过滤和重命名您的所有文件,而无需自定义批处理脚本。

例如,下面只会重命名看起来像"name.txt.ext"的文件,并将它们转换为"name_ext.txt"

jren "(\.txt)\.([^.]+)$" "_" /i