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

问题描述 投票:0回答:2

我有一组大约3000个文件夹,命名为XYZ-1到XYZ-3000。在这些文件夹里面有一组图片文件和一个描述文字文件。比如说

  • Property123_0001.jpg
  • 物业123_0002.jpg
  • 物业123_0003.jpg
  • ...
  • 属性123_0085.jpg
  • 房产123_0086.jpg
  • Z_Description.txt

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

我需要在.jpg文件的 "Property123 "部分之后重命名包含文件的文件夹。理想情况下,我会截断尾部的数字和下划线,但即使它们留在上面,也会比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%
)

不幸的是,当我运行它时,命令窗口立即关闭。我试过在最后放一个暂停命令,但这并不能使窗口保持打开。文件夹也没有任何变化。

我试了一下我在命令行中的语法,一切看起来都很正常。所以我不知道问题出在哪里。我可以得到一点帮助吗?

windows batch-file cmd batch-processing renaming
2个回答
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, 并在循环中使用 !而不是 %.

我还添加了设置"_name=%%D",这样如果第二个文件夹不包含文件,它就不会尝试将第二个文件夹改成第一个文件夹的名字。

EDIT:

还考虑到了下划线部分。

@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!
)
© www.soinside.com 2019 - 2024. All rights reserved.