如何使用Windows批处理编程重命名文件夹与该文件夹中第一个文件的文件名相同?

时间:2015-12-17 22:35:44

标签: windows batch-file cmd batch-processing renaming

我有一组约3,000个名为XYZ-1到XYZ-3000的文件夹。这些文件夹中包含图像文件组和描述文本文件。如:

  • Property123_0001.jpg
  • Property123_0002.jpg
  • Property123_0003.jpg
  • ...
  • Property123_0085.jpg
  • Property123_0086.jpg
  • Z_Description.txt

每个文件夹中.jpg个文件的数量不同,但始终只有一个描述文件。每个目录的图像文件都有不同的名称,例如`XYZ-1可能包含Property123,而XYZ-10可能包含Easement789。

我需要在" Property123"之后重命名包含文件的文件夹。部分.jpg文件。理想情况下,我会截断尾随数字和下划线,但即使它们保持开启,也会比XYZ-1名称更好。

我正在处理一个批处理文件来做这件事,但是我没有运行,我无法弄清楚原因。

以下是我所拥有的:

for /d %%D in (*) do (
   set "_dir=%%D"
   set /a "_first=1"
   cd "%%D"
   for %%F in (*) do (
      if %_first%==1 set "_name=%%~nF"
      set /a "_first=0"
   )
   cd ..
   ren %_dir% %_name%
)

不幸的是,当我运行它时,命令窗口立即关闭。我试着在最后放一个暂停命令,但那并没有让窗户保持打开状态。文件/文件夹没有任何变化。

我已经从命令行尝试了我的语法,一切看起来都还可以。所以我不知道问题是什么。我可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

试试这个:

@echo off
setlocal EnableDelayedExpansion
for /d %%D in (*) do (
   set "_dir=%%D"
   set "_name=%%D"
   set /a "_first=1"
   cd "%%D"
   for %%F in (*) do (
      if !_first!==1 set "_name=%%~nF"
      set /a "_first=0"
   )
   cd ..
   ren !_dir! !_name!
)

你需要在这里使用setlocal EnableDelayedExpansion,并使用!而不是%inside for循环。

我还添加了设置“_name = %% D”,因此如果该文件夹不包含文件,它将不会尝试将第二个文件夹更改为第一个文件夹名称

编辑:

还考虑了下划线部分:

@echo off
setlocal EnableDelayedExpansion
for /d %%D in (*) do (
   set "_dir=%%D"
   set "_name=%%D"
   set /a "_first=1"
   cd "%%D"
   for %%F in (*) do (
      if !_first!==1 (
        set "_name=%%~nF"
        set /a "_first=0"
        if NOT "!_name!"=="!_name:_=!" (
          set "subfix=!_name:*_=!"
          for /f "delims=" %%B in ("!subfix!") do set "_name=!_name:_%%B=!"
        )
      )
   )
   cd ..
   ren !_dir! !_name!
)