Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 批处理中带有额外后缀的文件_Batch File_Batch Rename - Fatal编程技术网

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

Batch file 批处理中带有额外后缀的文件,batch-file,batch-rename,Batch File,Batch Rename,我试图列出所有在扩展名后有额外后缀的文件 例如:.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" ) 这是通

我试图列出所有在扩展名后有额外后缀的文件 例如:.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"
)
这是通过使用“变量引用的
增强替换”来实现的,在本例中为
%%~xA
。通过对/?执行
,可以获得所有可用替换的概览

更新:

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

您可以使用两个嵌套的
循环,如下所示:

rem//更正了文件模式(添加了一个“.”):
对于“*.txt.*”中的%%A,请执行以下操作(
rem//检查(最后一个)文件扩展名:
如果/I不是“%%~xA”==”.txt”(
rem//删除(最后一个)文件扩展名:
对于(“%%~nA”)中的%%B,请执行以下操作(
rem//检查最后一个文件的下一个文本:
如果/I“%%~xB”==“.txt”(
呼叫:renum“%%~A”
)
)
)
)
根据
for
(在命令提示窗口中键入
for/?
)的帮助,
~x
for
变量的
~x
修饰符检索文件扩展名(这是最后一个点
以及之后的所有内容)。
~n
修饰符检索除文件扩展名以外的所有文件,从而获得文件(基本)名称。上面的代码使用两个嵌套的
for
循环来获取最后一个和下一个文件扩展名,并根据
.txt
检查它们(不区分大小写)


请注意,
调用
命令行不会对以
.txt.txt
结尾的文件执行,我会将FINDSTR与DIR/B和for/F一起使用

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

for /f "delims= eol=:" %%F in (
  'dir /b /a-d *.txt.*^|findstr /i "\.txt\."'
) do call :renum "%%F"
for /f "delims= eol=:" %%F in (
  'dir /b /a-d *.txt.*^|findstr /i "\.txt\.[^.]*$"'
) do call :renum "%%F"
此变体将仅处理具有单个额外扩展名的名称,如
name.txt.ext
(包括
name.txt.txt

你也可以查看我的。它可能可以在一个步骤中过滤和重命名所有文件,而不需要任何自定义批处理脚本

例如,以下仅重命名类似“name.txt.ext”的文件,并将其转换为“name\u ext.txt”


模式应为
*.txt.
(注意添加的点)..@aschipfl:您尝试过这样做会发生什么吗?已经尝试过了,但没有work@zb226,不,我没有,但很明显,
*txt.*
匹配类似
file.txtxt.1的内容,但
*.txt.*
不匹配;除此之外,没有更多的区别,两者都将匹配
file.txt.1.2
(无意中)…如果您知道精确的字符限制,那么您也许可以使用?而不是*,这可能会有点帮助。但是,您可能仍然需要在for循环中运行一个额外的if检查,如zb226的答案。如果文件名为“name.txt.txt”,这将不起作用。这也将不正确地处理名称,如“name_txt.ext”@dbenham:您是对的-我对这些问题发表了评论。+1,但我不明白为什么您要包含第一个IF语句,它过滤掉像“name.txt.txt”这样的名称。我想在某些情况下可能需要这样做,但我可能希望像这样重命名名称。@dbenham,因为OP的示例中,额外的后缀是数字,如
.1
.2
,。。。我假设如果最后一个扩展名是
.txt
,那么它已经很好了…如果文件名中有txt呢?@Bharath-搜索字符串中的前导点文字阻止在基名称中匹配txt。从技术上讲,
.txt
如果不在末尾,将被视为基本名称的一部分,但我们假设它是预期的扩展名。@Bharath-如果您希望包含像
XXXXtxt.ext
这样的名称,而不带前导点。然后简单地使用dir/b/a-d*txt.*^ findstr/i“txt\”
jren "(\.txt)\.([^.]+)$" "_$2$1" /i