好的,脚本编写者,
我仍在努力理解 FOR 命令。我想要做的是将所有子文件夹中的所有文件重命名为它们所在的文件夹名称,并保留其扩展名。我想可以用类似以下方法完成:
For /R %X in (*.*) do REN %X <argument for parent folder name>
也许我错了。正确的做法是什么?而且它必须是一个脚本。我不是在问 Bulk Rename Utility 或 File Renamer Deluxe 等。
谢谢你的时间!
答案1
只有当每个文件夹不超过一个给定类型的文件时,您才能实现既定目标。除非有特殊情况,否则这不是一个合理的期望。
但可以在每个文件前面插入父文件夹的名称 - 例如
"fileName.ext" --> "parentFolderName_fileName.ext"
该FOR /R
命令可以迭代根树内所有文件夹的文件夹路径。
该DIR /B /A-D "folderPath"
命令可以列出文件夹中的所有文件。但是您不想重命名已经以父文件夹名称开头的文件,因此可以将其传送到 FINDSTR 以排除已重命名的文件。
管道命令的结果可以用 FOR /F 进行迭代。EOL 和 DELIMS 选项用于确保保留每个文件的全名。
仅返回%%~nxD
父文件夹的文件夹名称和扩展名。
综上所述,下面这个很长的一行代码可以直接在命令行中使用。它将处理以当前目录为根的树。
for /r %D in (.) do @for /f "eol=: delims=" %F in ('dir /b /a-d "%D" 2^>nul^|findstr /vbic:"%~nxD_"') do ren "%D\%F" "%~nxD_%F"
该命令可以放在脚本中,然后可以将要处理的根文件夹作为参数传入。如果没有给出参数,则脚本将从当前目录开始处理。如果给出了参数,则该值将用作根文件夹。
@for /r %1 %%D in (.) do @for /f "eol=: delims=" %%F in (
'dir /b /a-d "%%D" 2^>nul^|findstr /vbic:"%%~nxD_"'
) do ren "%%D\%%F" "%%~nxD_%%F"
如果你使用我的代码会更简单JREN.BAT 正则表达式重命名实用程序。它是纯脚本(混合批处理/JScript),可在 XP 及以上版本的任何 Windows 机器上本地运行。无需第三方 exe 文件。
完整文档嵌入在实用程序中 - 可通过访问jren /?
,或者jren /??
如果您想要分页输出。
以下简单命令将处理以当前目录为根的树:
for /r %F in (.) do @call jren "^" "%~nxF_" /p "%F" /fx "%~nxF_*"
前两个 JREN 参数是查找/替换字符串 - 搜索匹配文件名的开头,替换仅插入父文件夹名称(带有尾随下划线)。该/P "%F"
选项指定根文件夹。并且该/FX "%~nxF_*
选项排除已经以父文件夹名称开头,后跟下划线的文件。
该命令可以放在批处理脚本中,该脚本接受可选的根文件夹作为参数(如果没有给出值,则处理当前目录):
@echo off
for /r %1 %%F in (.) do call jren "^" "%%~nxF_" /p "%%F" /fx "%%~nxF_*"
答案2
答案3
最后一个答案很有帮助,但我遇到了重复名称的问题,有什么解决办法吗
你能给我解释一下代码吗?因为我很难理解这两个代码之间的区别
@echo off for /r %%D in (.) do ( for /f "delims=" %%F in ('dir /b /A:-D "%%D"') do echo "%%D%%F" "%%~nxD%%~xF" )
@echo off for /r %%F in (*) do ( for /f "delims=" %%D in ("%%~dpF.") do echo "%%F" "%%~nxD%%~xF" )
感谢 Amro Omran
答案4
此代码
for /r %D in (.) do @for /f "eol=: delims=" %F in ('dir /b /a-d "%D" 2^>nul^|findstr /vbic:"%~nxD_"') do ren "%D\%F" "%~nxD_%F"
对我来说效果很好,但它只会在文件名中添加第一级文件夹的名称,我希望它能添加包含该文件的前四个文件夹的名称。类似:
路径中的 filename.txt
C:\Users\Tom\Desktop\Cond1\Series2
变得
Tom_Desktop_Cond1_Series2_filename.txt