【问题标题】:Rename Files if name contains with batch如果名称包含批处理,则重命名文件
【发布时间】:2013-07-06 15:50:10
【问题描述】:

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

  • 文件名包含“raw.footage”
  • 文件名包含“resized.1080”
  • 文件名包含“resized.720”
  • 文件名包含“converted.avi”

我正在尝试根据它们的名称重命名这些文件。 raw.footage 应该重命名为 raw,resized.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.footage 重命名的第一个块本身可以正常工作,但添加第二个块只会导致命令行在块之间跳转,但文件没有任何反应。

【问题讨论】:

  • 嗯,我在这里得到了答案,所以...
  • @Mgetz:不,不是。这是关于批处理文件编程的,在这里完全可以接受。

标签: windows file batch-file


【解决方案1】:
@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 OFF
SETLOCAL
SET "completepath=."
SET "subfor="
FOR /R %completepath% %%G IN (*.mp4 *.wmv) 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" "%%~xG") ELSE (SET "subfor=%%s")
 )
)
GOTO :EOF
:process
SET name=%~1
CALL SET chkname=%%name:%subfor%=%~2%%
IF NOT "%name%"=="%chkname%" ECHO REN "%mp4path%%name%%~3" "%chkname%%~3"
SET "subfor="
GOTO :eof

【讨论】:

  • 很抱歉碰到问题,但是否可以在该脚本中添加另一个容器?这样所有 .mp4 AND .wmv 都会被重命名?名称是相同的。提前致谢。
【解决方案2】:

我喜欢 batch 的美妙之处在于它的循环:

@echo off &SETLOCAL ENABLEDELAYEDEXPANSION CD /d %startfolder% FOR %%i IN ( raw.footage=原始 调整大小.1080=1080 调整大小.720=720 转换的.avi=转换的 ) 做 ( SET "oldname=!newname!" SET "新名称=%%i" 如果定义旧名称( FOR /f "delims=" %%a IN ('dir /b/a-d "*!oldname!*"') DO ( SET "旧文件名=%%~a" CALL SET "newfilename=%%oldfilename:!oldname!=!newname!%%" ECHO REN "!oldfilename!" “!新文件名!” ) SET 新名称=&SET 旧名称= ) )

请注意,这只是观看,不是投票。

【讨论】:

    【解决方案3】:

    同一事物的另一个版本(用于比较目的):

    @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!"
       )
    )
    

    【讨论】:

      猜你喜欢
      • 2020-01-24
      • 2011-04-10
      • 2019-02-14
      • 2013-05-29
      • 1970-01-01
      • 2019-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多