Batch file Can';t获取令牌中的最后2个字符,for循环返回vaiable中的第一个令牌

Batch file Can';t获取令牌中的最后2个字符,for循环返回vaiable中的第一个令牌,batch-file,for-loop,token,rename,Batch File,For Loop,Token,Rename,好的,这里是设置: 我有大量以下格式的文本文件: filename## time Description of file with spaces 我正在尝试使用for循环,使用文件描述重命名磁盘上的实际文件: FOR /F "tokens=1,2,*" %%a IN (%1) DO call :rename %%a %%b "%%c" goto :eof :rename set origfilename=%1 set last2=%1:~-2% set time=%2 set "multiwo

好的,这里是设置:

我有大量以下格式的文本文件:

filename## time Description of file with spaces
我正在尝试使用for循环,使用文件描述重命名磁盘上的实际文件:

FOR /F "tokens=1,2,*" %%a IN (%1) DO call :rename %%a %%b "%%c"
goto :eof
:rename
set origfilename=%1
set last2=%1:~-2%
set time=%2
set "multiword=%~3"

ren %origfilename%.ext "%last2%_%time%_%multiword%.ext"

set origfilename=
set last2=
set time=
set multiword=
下面是正在发生的事情:

last2从未提取原始文件名的最后2个字符,如果在DO之后而不是调用:rename之后回显%3,则它具有带空格的完整标记。当我尝试在循环中使用%3时,它只包含%3的第一个标记。 在for之前,我尝试使用setlocal EnableDelayedExpansion,但它没有像我预期的那样工作


我是否试图一次做太多事情?谢谢你的帮助

试试这个。我想这会满足你的要求

@echo off 
for /f "Tokens=1,2,3*" %%a in ('dir /b filename*') do (
   call :rename "%%a %%b %%c %%d" %%a %%b "%%c %%d")
goto :eof
:rename full orig time new
echo %2
set last2=%2
set last2=%last2:~-2%
echo ren "%~1.ext" "%last2%_%3_%~4.ext"

如果一切正常,请删除回显

编辑您的帖子并显示3个实际文件名。实际上,输入(整行)和结果的示例将有助于诊断问题。好的。。我将输入更改为%1,并将最后一行更改为echo ren“%~2.avi”“%last2%\u%3\%~4.avi”,所有这些都可以按需要工作。我不知道您可以将令牌分组并将其作为变量传递。那太棒了。谢谢你,马特!!