批处理中带有额外后缀的文件

时间:2016-07-12 13:32:21

标签: batch-file batch-rename

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

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

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

在此之后,我正在编写程序来相应地重命名文件。 有人可以检查和帮助。

3 个答案:

答案 0 :(得分:2)

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

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

这可以通过使用FOR变量引用"的增强替换来实现,在这种情况下为%%~xA。您可以通过执行FOR /?来了解所有可用的替换。

更新:

  • 此解决方案不区分大小写,因为既没有明确要求也没有禁止。如果需要不区分大小写,请使用IF /I代替普通IF
  • dbenham所述,有边缘情况:
    • name.txt.txt 不会处理。如果没有明确说明,那很可能。
    • name_txt.ext 处理,这是由于给定的通配符*txt.*所致,可以通过使用*.txt.*来避免。我首先不改变它的理由是,只有OP知道他的实际文件集,并且我认为他有理由选择它(在这些类型的问题中常见的情况)。

答案 1 :(得分:1)

您可以使用两个嵌套的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(在命令提示符窗口中键入for /?)的帮助,~x变量的for修饰符检索文件扩展名(即最后一个点.以及之后的所有内容)。 ~n修饰符检索除文件扩展名以外的所有内容,因此检索文件(基本)名称。上面的代码使用两个嵌套的for循环来获取最后一个和倒数第二个文件扩展名,并针对.txt进行检查(以不区分大小写的方式)。

请注意,对于以call结尾的文件,不会执行.txt.txt命令行。

答案 2 :(得分:1)

我会使用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)\.([^.]+)$" "_$2$1" /i