使用父文件夹/目录名称作为变量重命名文件

时间:2014-07-17 17:22:17

标签: variables batch-file

我正在尝试创建一个批处理脚本,该脚本将使用父文件夹名称重命名所有子文件夹中的所有文档,然后重命名原始文件名。例如:

有200个具有唯一4位数字名称的文件夹,所有文件夹都包含一个名为"数据表"的文件夹。我想重命名Data Sheets文件夹中的所有文档以包含4位唯一ID名称。基本上我希望将文档从data sheet.doc重命名为1234 data sheet.doc

有很多批处理脚本可以做一些非常接近我想做的事情,但我无法修改它们来完全按照我的需要做。任何帮助,将不胜感激。这就是我尝试使用类似版本试图让它工作的原因。

@echo off 
for /r %%a in ("S:\Fiscal Yr. 2015\*\*.doc") do ( 
for /d %%d in (%CD%) do ( 
set newname=%%~nd%~x1 
ren "%%~a" "!newname!%%~Xa" 
echo media file in %%~fa renamed to "!newname!%%~Xa" 
) 
) 

扎克

2 个答案:

答案 0 :(得分:1)

澄清一下 - 这将处理名为" Data Sheets"的任何文件夹中的每个.doc文件。并重命名文件以将the parent folder-name to "Data Sheets"添加到.doc文件的开头。

在删除第一个echo语句之前,这将回显重命名命令以确认它是否正确。

@echo off 
for /r "S:\Fiscal Yr. 2015" %%a in (*.doc) do (
   for /f "delims=" %%b in ("%%~pa\.") do (
      if /i "%%~nxb"=="Data Sheets" for /f "delims=" %%c in ("%%~pb\.") do (
         echo ren "%%a" "%%~nxc %%~nxa" 
         echo media file "%%a" renamed to "%%~nxc %%~nxa"
      )
   ) 
) 
pause

答案 1 :(得分:0)

这是一个简单的例子,说明如何重命名整个文件夹结构中的所有文件,包括所有子文件夹:

@echo off

setlocal ENABLEDELAYEDEXPANSION

cd /d "S:\Fiscal Yr. 2015"
set _cd=%CD%

for /f "delims=" %%i in ('dir *.doc /a-d /s /b') do (
  set old_fn=%%~fni
  set new_fn=!old_fn:%_cd%\=!
  set new_fn=!new_fn:Data Sheets\=!
  set new_fn=!new_fn:\= !
  echo ren "!old_fn!" "!new_fn!"
)

endlocal

for命令枚举当前文件夹和子文件夹(\s开关)中的所有.doc文件。 \b开关使用bare格式输出文件名(在这种情况下包括完整路径)。 /a-d使其忽略目录,因此只重命名文件。

使用setlocal / endlocal可以使用延迟扩展变量,因此我们使用!代替% set命令。延迟扩展可确保在使用变量时重新评估变量,而不是使用分配给它们的原始值。

echo ren ...使重命名命令回显到控制台而不是实际执行重命名。在您真正运行它之前,您需要验证它是否输出了正确的重命名语句,并且在您实际执行之前备份文件夹结构是个好主意,因为没有撤消对于这种类型的操作。

批处理文件删除了前导路径,只保留子文件夹的名称,在文件名之前添加它,同时从新文件名中删除数据表文件夹名称。