Windows 如果名称包含批处理,请重命名文件

Windows 如果名称包含批处理,请重命名文件,windows,file,batch-file,Windows,File,Batch File,我目前正试图根据文件名的内容重命名一些文件。 我有4种不同的可能性: 文件名包含“raw.contines” 文件名包含“已调整大小的.1080” 文件名包含“已调整大小的.720” 文件名包含“converted.avi” 我正试图根据这些文件的名称重命名它们。 raw.taines应重命名为raw,并将其大小调整为0.1080到1080,等等 如果可能的话,我希望每个可能的名称只有一个.bat脚本/文件,而不是四个 以下是我迄今为止所做的工作: FOR /R %completepath%

我目前正试图根据文件名的内容重命名一些文件。 我有4种不同的可能性:

  • 文件名包含“raw.contines”
  • 文件名包含“已调整大小的.1080”
  • 文件名包含“已调整大小的.720”
  • 文件名包含“converted.avi”
我正试图根据这些文件的名称重命名它们。 raw.taines应重命名为raw,并将其大小调整为0.1080到1080,等等

如果可能的话,我希望每个可能的名称只有一个.bat脚本/文件,而不是四个

以下是我迄今为止所做的工作:

FOR /R %completepath% %%G IN (*.mp4) DO call :process "%%~nG"
GOTO :EOF

:process
SET %name%=%~1
SET chkname=%name:*raw.footage=?%
IF "%chkname:~0,1%"=="?" (
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
SET old=raw.footage
SET new=raw
for /f "tokens=*" %%f in ('dir /b *.mp4') do (
  SET newname=%%f
  SET newname=!newname:%old%=%new%!
  move "%%f" "!newname!"
)
) ELSE (
  GOTO 1080p
)

:1080p

FOR /R %completepath% %%G IN (*.mp4) DO call :process "%%~nG"
GOTO :EOF

:process
SET %name%=%~1
SET chkname=%name:*resized.1080=?%
IF "%chkname:~0,1%"=="?" (
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
SET old=resized.1080
SET new=1080
for /f "tokens=*" %%f in ('dir /b *.mp4') do (
  SET newname=%%f
  SET newname=!newname:%old%=%new%!
  move "%%f" "!newname!"
)
) ELSE (
  GOTO 720
)
当使用第一个块时,它只包含对raw.taines的重命名,它本身就可以正常工作,添加第二个块只会导致命令行在块之间跳转,但文件不会发生任何变化

@ECHO OFF
SETLOCAL
SET "completepath=."
SET "subfor="
FOR /R %completepath% %%G IN (*.mp4) DO FOR %%s IN (
     raw.footage raw resized.1080 1080 resized.720 720 converted.avi converted) DO (
 SET mp4path=%%~dpG
 IF DEFINED subfor (call :process "%%~nG" "%%s") ELSE (SET "subfor=%%s")
 )
)
GOTO :EOF
:process
SET name=%~1
CALL SET chkname=%%name:%subfor%=%~2%%
IF NOT "%name%"=="%chkname%" ECHO REN "%mp4path%%name%.mp4" "%chkname%.mp4"
SET "subfor="
GOTO :eof
转换字符串(从到)仅成对插入…完成。简单


修订以适应新的要求

@ECHO关闭
SETLOCAL
设置“completepath=”
设置“子文件夹=”
对于(*.mp4*.wmv)中的/R%completepath%%%G,在中为%%s执行(
raw.taines raw resized.1080 1080 resized.720 720 converted.avi converted)DO(
设置mp4path=%%~dpG
如果定义了子文件夹(调用:进程“%%~nG”“%%s”“%%~xG”),则为其他(设置“子文件夹=%%s”)
)
)
后藤:EOF
:进程
集合名称=%~1
调用集chkname=%%名称:%subfor%%=%~2%%
如果不是“%name%”==“chkname%”回显REN“%mp4path%%name%%~3”%chkname%%~3“
设置“子文件夹=”
后藤:eof
我喜欢batch,因为它的循环非常漂亮: @echo off&设置本地启用延迟扩展 CD/d%startfolder% 对于%%i IN( 原始。镜头=原始 调整大小。1080=1080 调整大小。720=720 已转换。avi=已转换 )做( 设置“oldname=!newname!” 设置“newname=%%i” 如果定义为oldname( 对于/f“delims=“%%a IN('dir/b/a-d”*!oldname!*”)DO( 设置“oldfilename=%%~a” 调用集“newfilename=%%oldfilename:!oldname!=!newname!%%” ECHO REN“!oldfilename!”!newfilename!” ) 设置新名称=&设置旧名称= ) )
请注意,这只是为了观看,而不是投票。

相同内容的另一个版本(用于比较):


嗯,我这里有我的答案,所以…@Mgetz:不,不是。这是关于批处理文件编程的,这在这里是完全可以接受的。很抱歉,我的问题是,可以在脚本中添加另一个容器吗?那么所有的.mp4和.wmv都将被重命名?名字是一样的。提前谢谢。 @echo off &SETLOCAL ENABLEDELAYEDEXPANSION CD /d %startfolder% FOR %%i IN ( raw.footage=raw resized.1080=1080 resized.720=720 converted.avi=converted ) DO ( SET "oldname=!newname!" SET "newname=%%i" IF DEFINED oldname ( FOR /f "delims=" %%a IN ('dir /b/a-d "*!oldname!*"') DO ( SET "oldfilename=%%~a" CALL SET "newfilename=%%oldfilename:!oldname!=!newname!%%" ECHO REN "!oldfilename!" "!newfilename!" ) SET newname=&SET oldname= ) )
@echo off
setlocal EnableDelayedExpansion
set "completepath=."
FOR /R "%completepath%" %%G IN (*.mp4) DO (
   set "name=%%~nxG"
   for %%s in ("raw.footage=raw" "resized.1080=1080" "resized.720=720" "converted.avi=converted") do (
      set "chkname=!name:%%~s!"
      if "!name!" neq "!chkname!" ECHO REN "%%G" "!chkname!"
   )
)