在 cmd 中使用多个父文件夹名称作为文件名的前缀

在 cmd 中使用多个父文件夹名称作为文件名的前缀

挑战

扩展帖子,如何在文件名前加上前缀以包含其父文件夹名称。@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"- 将反斜杠替换为下划线

相关内容