如何使用 Windows 批处理程序重命名文件夹为该文件夹中第一个文件的文件名?

How to rename a folder the same as the filename of the first file inside that folder using Windows batch programming?

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

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

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

不幸的是,当我 运行 它时,命令 window 立即关闭。我尝试在末尾放置一个暂停命令,但这并没有使 window 保持打开状态。 files/folders.

没有任何反应

我已经从命令行尝试了我的语法,一切看起来都正常。所以我不知道问题是什么。我能得到一点帮助吗?

试试这个:

@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 loops.

我还添加了设置“_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!
)