Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.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
Windows 用批处理替换文件名中的字符_Windows_Batch File_Cmd_For Loop - Fatal编程技术网

Windows 用批处理替换文件名中的字符

Windows 用批处理替换文件名中的字符,windows,batch-file,cmd,for-loop,Windows,Batch File,Cmd,For Loop,编辑:刚刚发现这不是一个罕见的问题,我的问题被标记为重复的 问题: 我有两个文件,我想用一个使用REN的批处理文件来替换u IMG_0002.JPG->IMG_10002.JPG IMG_0013.JPG->IMG_10013.JPG 我正在使用以下脚本: for %%a in (IMG_*.*) do call :next %%a pause GOTO:EOF :next set newname=%1 set newname=%newname:_=_1% ren %1 %newname%

编辑:刚刚发现这不是一个罕见的问题,我的问题被标记为重复的

问题:

我有两个文件,我想用一个使用REN的批处理文件来替换u

IMG_0002.JPG->IMG_10002.JPG IMG_0013.JPG->IMG_10013.JPG

我正在使用以下脚本:

for %%a in (IMG_*.*) do call :next %%a
pause
GOTO:EOF

:next
set newname=%1
set newname=%newname:_=_1%
ren %1 %newname%
问题是,循环不是运行了2次,而是运行了3次:

for %a in (IMG_*.*) do call :next %a

call :next IMG_0002.JPG
set newname=IMG_0002.JPG
set newname=IMG_10002.JPG
ren IMG_0002.JPG IMG_10002.JPG

call :next IMG_0013.JPG
set newname=IMG_0013.JPG
set newname=IMG_10013.JPG
ren IMG_0013.JPG IMG_10013.JPG

call :next IMG_10002.JPG
set newname=IMG_10002.JPG
set newname=IMG_110002.JPG
ren IMG_10002.JPG IMG_110002.JPG

pause
留给我以下两个文件名:

IMG_110002.JPG IMG_10013.JPG

知道发生了什么事以及如何修改脚本吗


谢谢

< p>我会考虑用集合来使用/a参数,然后你可以简单地把1加到这个数字中,或者在它后面得到实际的数字,然后在它的末尾加上一个数字。它可能会使您的文件更具可读性。

我假设您不知道实际的数字序列是什么,并且可能还有其他IMG_*.JPG文件,这些文件可能具有不同数量的连续数字,应该单独保留

因此,这里是一个简单的示例,它执行当前目录中与glob IMG*.JPG匹配的所有文件的目录列表,并将这些文件通过findstr.exe匹配进行传输,查找名称大小写不敏感地匹配IMG,后跟四位数字,大小写不敏感地以.JPG结尾。然后将这些标记传递给一个函数,以将每个返回的文件名拆分为两个标记,并用下划线分隔。第一个标记将是第一个分隔符之前的所有内容,第二个标记将是第一个分隔符之后的所有内容。重命名是通过使用_1分隔符将两个标记重新连接在一起来执行的

@回音 setLocalEnableExtensions 对于/F Delims=%%G In'Dir/B/A:-D IMG_*.JPG^ ^|%SystemRoot%\System32\findstr.exe^ /IR^IMG\[0123456789][0123456789][0123456789][0123456789][0123456789]\.JPG$' Do For/F代币=1,*Delims=\%%H In%%G Do Ren%%G%%H_1%%~nI%%~xG 上述命令实际上是一个单行命令,分为多行以便于阅读,因此您可以在一行中使用它,并直接在以下目录中对当前目录运行它:

对于/F Delims^=%G In'Dir/B/A-D IMG.*.JPG^%SystemRoot%\System32\findstr.exe/IR^IMG.[0123456789][0123456789][0123456789][0123456789][0123456789][0123456789][0123456789][0123456789][0123456789][0123456789]\.JPG$'Do@For/F令牌=1*Delims=%H In%GDo@Ren G%G%G
问题在于FOR命令。它会将新重命名的文件视为必须迭代的文件。所以你用这个来代替。对于/F delims=%%a in'dir/b/a-d IMG_*.*的do call:next%%a dir/X IMG_*.*返回什么?@Squashman这实际上是我认为这可能发生的唯一方式,但不敢相信会是这样。谢谢,现在我明白为什么使用dir更适合我的情况了。@aschipfl:它只返回两个文件IMG_0002.JPG和IMG_0013。JPG@KevinPullsoft,在您发布上述评论时,您已收到三个答案。请检查并提供必要的反馈。人们从一天中抽出时间为您提供具体的帮助,而忽视这些为您所做的努力似乎是不礼貌的!行。我使用的是@Squashman的解决方案,它确实有效,并且回答了这个问题,所以如果你能将你的评论加入到答案中,我会将它标记为已被接受的答案。我很欣赏这个详尽的答案,但它比我需要的做得更多。我甚至可能在将来使用它,但要回答最初的问题-转换所有的IMG。对于IMG_1***-只需要对我的脚本进行一点小的修改。无论如何,谢谢你。它只做了KevinPullsoft所需要的事情。它完全按照要求执行,并且以一种不需要或很少需要修改的方式执行。如果在包含IMG_*.jpg文件的任何目录中运行此命令,它将重命名所有包含四位数字的目录,以包含前导1。它不需要知道任何文件名,也不需要硬编码。所有这些都可以。事实上,我上面的答案是对您提供的代码和Squashman的初始注释的一种改进方法,这两种方法都不必要地使用call命令。