挑战
扩展这帖子,如何在文件名前加上前缀以包含其父文件夹名称。@dbenham 回复(见下文)很棒,但它只在文件名中加上直接父文件夹的名称作为前缀。不允许使用 Powershell!
前:
C:\照片\猫
文件A.txt
文件B.txt
文件C.txt
后:
C:\照片\猫
照片_猫_文件A.txt 照片 _
猫_文件B.txt 照片_猫_文件C.txt
其中分隔符“_”可以是任意字符。
近解
@dbenham 的代码来自这帖子内容如下:
@echo off
pushd "Folder"
for /d %%D in (*) do (
pushd "%%D"
for /r %%F in (*) do (
for %%P in ("%%F\..") do (
ren "%%F" "%%~nxP_%%~nxF"
)
)
popd
)
popd
它能做什么
C:\照片\猫
cats_fileA.txt
cats_fileB.txt
cats_fileC.txt
再次强调,这不包括“照片”。如何包含?
先行致谢!
答案1
为了包含完整的文件路径,您需要进行一些变量处理,for
如果不启用延迟扩展,这在批处理循环中不起作用。
使用下面的批处理文件代替原来的文件。
@echo off
pushd "Folder"
setlocal enabledelayedexpansion
for /d %%D in (*) do (
pushd "%%D"
for /r %%F in (*) do (
for %%P in ("%%F\..") do (
set _path=%%~pnxP
set _path=!_path:~1!
ren "%%F" "!_path:\=_!_%%~nxF"
)
)
popd
)
popd
不同之处在于:
setlocal enabledelayedexpansion
- 启用延迟扩展set _path=%%~pnxP
- 创建一个变量来存储文件的完整路径(不包括驱动器号)set _path=!_path:~1!
- 完整路径开头包含\
in ,所以我们需要将其删除。C:\
echo "%%F" "!_path:\=_!_%%~nxF"
- 将反斜杠替换为下划线