批量添加额外后缀的文件
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.ext
和 name.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
我正在尝试列出所有在扩展名后有额外后缀的文件 例如:.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.ext
和 name.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