Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.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_Cmd_File Rename - Fatal编程技术网

Batch file 重命名数字系列中的文件

Batch file 重命名数字系列中的文件,batch-file,cmd,file-rename,Batch File,Cmd,File Rename,因此,我使用的应用程序创建了一系列.tif文件,这些文件的文件名非常烦人,不能按字母数字顺序正确排序。我没有办法改变这个商业软件的行为,所以我必须用我自己的创意来重命名这些文件,以便它们可以在外部以正确的顺序进行处理。例如,创建的文件如下所示: image.tif,image(2).tif,image(3).tif,…,image(9).tif,image(10).tif,image(n).tif 其中n是不小于2的整数。第一个文件的括号中没有数字。例如,按字母数字排序的列表如下所示: imag

因此,我使用的应用程序创建了一系列
.tif
文件,这些文件的文件名非常烦人,不能按字母数字顺序正确排序。我没有办法改变这个商业软件的行为,所以我必须用我自己的创意来重命名这些文件,以便它们可以在外部以正确的顺序进行处理。例如,创建的文件如下所示:

image.tif
image(2).tif
image(3).tif
,…,
image(9).tif
image(10).tif
image(n).tif

其中n是不小于2的整数。第一个文件的括号中没有数字。例如,按字母数字排序的列表如下所示:

image.tif
image(10).tif
image(100).tif
image(1000)
image(2).tif

显然,虽然这是正确的字母数字顺序,但这是错误的数字顺序。因此,借助一些批处理命令,我创建了以下内容:

@echo off & setlocal EnableDelayedExpansion 

ren "image.tif" "a.tif"
ren "image(1).tif" "b.tif"
ren "image(2).tif" "c.tif"
ren "image(3).tif" "d.tif"
ren "image(4).tif" "e.tif"
ren "image(5).tif" "f.tif"
ren "image(6).tif" "g.tif"
ren "image(7).tif" "h.tif"
ren "image(8).tif" "i.tif"
ren "image(9).tif" "j.tif"

set a=1
for /f "delims=" %%i in ('dir /b *.tif') do (
  ren "%%i" "!a!.tif" 
  set /a a+=1
) 
这至少纠正了前十个文件的名称,因为我通常处理不到100个文件。for循环是我在stackoverflow上找到的一个片段,它将字母数字文件重命名为整数,从1开始,直到文件数

我遇到的问题是,这个循环仍然会在
2.tif
之前创建
1.tif
10.tif
100.tif

我见过使用
%02d
将数字格式化为01、02、10等。有人知道如何在上面所示的循环中按语法包含这些数字吗


或者,如果有人能想出一种更优雅的方法将这些文件重命名为合适的字母数字顺序,那将不胜感激。我觉得我的解决方案非常笨拙。

填充数字的
%02d
约定是一种
printf
方式,并不真正适用于Windows cmd环境或批处理脚本。PowerShell有,但不是纯批处理。但是,您可以很容易地使用零填充数字

如果您希望保持
image(idx).tif的命名约定,同时确保tif文件保持其预期的顺序,那么一个惰性解决方案可能是使用regexp并重命名

prename /v "s/\((\d)\)/(00\1)/" *.tif
prename /v "s/\((\d\d)\)/(0\1)/" *.tif

填充数字的
%02d
约定是一种
printf
约定,并不真正适用于Windows cmd环境或批处理脚本。PowerShell有,但不是纯批处理。但是,您可以很容易地使用零填充数字

如果您希望保持
image(idx).tif的命名约定,同时确保tif文件保持其预期的顺序,那么一个惰性解决方案可能是使用regexp并重命名

prename /v "s/\((\d)\)/(00\1)/" *.tif
prename /v "s/\((\d\d)\)/(0\1)/" *.tif
[未经测试]

如果“image(100).tif”存在,那么我们需要重命名为(001)…(999)。如果不是,则为(01)…(99),因此数字长度将为3或2

对于每个名称1..max,如果文件存在,则计算1000+文件号;取最后3或2个字符并重命名。仅当目标名称不存在时才尝试重命名,因此(6)将重命名为(006)或(06),(15)至(05)或跳过为(15)=(15),并且(123)也将跳过为(123)=(123)
最后,将
image.tif
文件重命名为(000)或(00)

请注意,这将简单地
回显
允许验证所需的命令。验证是否实际执行重命名后,将
echo(ren
更改为
ren

[未经测试]

如果“image(100).tif”存在,那么我们需要重命名为(001)…(999)。如果不存在,则重命名为(01)…(99),那么数字长度将为3或2

对于每个名称1..max,如果文件存在,则计算1000+文件号;取最后3或2个字符并重命名。仅当目标名称不存在时才尝试重命名,因此(6)将重命名为(006)或(06),(15)至(05)或跳过为(15)=(15),(123)也将跳过为(123)=(123)
最后,将
image.tif
文件重命名为(000)或(00)


注意,这将只需要
echo
允许验证的所需命令(ren
ren
验证是否实际执行重命名时。

cmd
中,没有类似
%02d
的格式字符串。但是,您可以使用来检索文件的普通列表,筛选名称中有括号数字后缀或根本没有此类后缀的文件,以捕获生成的文件名并根据
将它们拆分为令牌,并执行实际的左零填充,如以下示例所示:

@echo关闭
setlocal EnableExtensions DisableDelayedExpansion
rem//在此处定义常量:
设置“_LOCATION=。”&rem/(包含要重命名的文件的目录)
设置“_PATTERN=*.tif”&rem//(搜索要重命名的文件的模式)
设置/A“_DIGITS=4”&rem//(建议位数从1到10)
设置“\u REGEX1=^[^()][^()]*([0-9][0-9]*)\.tif$”&rem//(过滤器表达式)
设置“\u REGEX2=^[^()][^()]*\.tif$”&rem//(过滤器表达式)
rem/(过滤器表达式确保不会处理名称错误的文件)
rem//生成零填充字符串:
设置“PAD=0000000000”和调用设置“PAD=%%PAD:~-%\u位%%”
rem//循环浏览所有匹配的文件:
对于/F“tokens=1-3 delims=()”%%A in('
目录/B/O:N“%\u模式%”^ findstr/I/R/C:“%\u REGEX1%”/C:“%\u REGEX2%”
""做"(
rem//检查当前文件名是否包含括号内的数字后缀:
如果不是“%%B”==”“(
rem//找到数字后缀,因此存储文件名零件和焊盘编号:
设置“左=%%A”&设置“中=%PAD%%B”&设置“右=%%C”
setlocal EnableDelayedExpansion
回声重命名“!左!(%B)!右!”!左!(!中间:~-%\u位%!)!右!”
端部
)否则(
rem//未遇到数字后缀,因此附加零后缀:
回显重命名“%%A”“%%~nA(%PAD%)%%~xA”
)
)
端部
退出/B
@echo off
setlocal EnableDelayedExpansion

rem Initialize "i" variable with the desired number of digits as zeros
set i=1000

rem Process the files in creation date-time order
for /F "delims=" %%a in ('dir /A-D /OD /B *.tif') do (

   rem Increment the number: "1001"...
   set /A i+=1

   rem Omit first digit in number: "1", use the rest: "001"...
   ren "%%a" "image(!i:~1!).tif"

)
@echo off
setlocal EnableDelayedExpansion 
set /a max=99&set /a numlen=2
if exist "image(100).tif" set /a max=999&set /a numlen=3
for /L %%a in (1,1,%max%) do if exist "image(%%a).tif" set /a newnum=1000+%%a&if not exist "image(!newnum:~-%numlen%!).tif" echo(ren "image(%%a).tif" "image(!newnum:~-%numlen%!).tif"
set /a max+=1
echo(ren "image.tif" "image(!newnum:~-%numlen%!).tif"