这基本上是已回答问题的延续,但有附加条件
我有一个如下的目录结构:
Folder
> SubFolder1xxxx
> FileName1.abc
> Filename2.abc
> .............
> SubFolder2xxxx
> FileName11.abc
> Filename12.abc
> ..............
> ..........
等等。我想将子文件夹内的文件重命名为:
SubFolder1_Filename1.abc
SubFolder1_Filename2.abc
SubFolder2_Filename11.abc
SubFolder2_Filename12.abc
即在文件名开头添加部分文件夹名称,并以“ _
”作为分隔符。目录结构应保持不变。
我有以下脚本
for /d %D in (*) do (
for %F in ("%~D\*") do (
for %P in ("%F\..") do (
ren "%F" "%~nxP_%~nxF"
)
)
)
上述脚本的问题在于它采用了整个文件夹名称
因此我尝试使用语法子字符串仅提取文件名的一部分
%variable:~num_chars_to_skip,num_chars_to_keep%
所以我用它修改了上面的代码,但是它给出了错误:(
for /d %D in (*) do (
for %F in ("%~D\*") do (
for %P in ("%F\..") do (
ren "%F" "%~nxP:~0,10%_%~nxF"
)
)
)
错误基本上是语法子字符串不起作用,它只是将其打印为字符串。像这样
SubFolder1xxxx:~0,10%
答案1
获取批处理文件文件夹名称的示例批处理。
@echo off
set a=%~p0%
for /f "tokens=1,2,3,4,5,6,7,8,9 delims=\" %%a in ("%a%") do call :getlast %%a %%b %%c %%d %%e %%f %%g %%h %%i
goto :eof
:getlast
if "%1"=="" goto :eof
if "%2"=="" echo Current folder name is %1.
shift
goto :getlast
当前限制:不超过 9 个子文件夹级别(编辑,如果需要,解析 slack),名称中没有空格(编辑,如果需要,添加引号)。