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

4sup72z8  于 2023-04-22  发布在  Windows
关注(0)|答案(1)|浏览(190)

我有一组大约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可能包含Property 123,而XYZ-10可能包含Easement 789。
我需要重命名包含.jpg文件的“Property 123”部分之后的文件的文件夹。理想情况下,我会截断尾随数字和下划线,但即使它们保留,也会比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%
)

不幸的是,当我运行它时,命令窗口立即关闭。我试着在最后放一个暂停命令,但这并没有保持窗口打开。文件/文件夹没有发生任何变化。
我已经从命令行尝试了我的语法,看起来一切正常。所以我不知道是什么问题。我能得到一点帮助吗?

camsedfj

camsedfj1#

试试这个:

@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,并在for循环中使用!而不是%。
我还添加了set“_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!
)

相关问题