如何使用 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。这些文件夹内是图像文件组和描述文本文件。如:
- 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.
我需要在 .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!
)
我有一组大约 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.
我需要在 .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!
)