我在文件夹的子文件夹中有RabcdYYMMKKACCOUNT.TXT
个文件,其中YYMM
是年份,月份会发生变化。 KK
是另一个标识符,我希望将所有文件重命名为MSFKKDNB.ABC
,KK
是输入文件中的标识符。
以下是我尝试的那个及其结果:
FOR /R %%f IN (*account.txt) DO REN "%%f" *dnb.abc
R00531706AUAccount.txt
已重命名为R00531706AUAccount.txtdnb.abc
但输出应为MSFAUDNB.abc
答案 0 :(得分:0)
试试这个:
@Echo Off
For %%A In ("*account.txt") Do (Set "_=%%~nA"
SetLocal EnableDelayedExpansion
Ren "%%A" "MSF!_:~-9,2!DNB.abc"
EndLocal)
答案 1 :(得分:0)
这可以通过以下方式完成:
@echo off
setlocal EnableExtensions EnableDelayedExpansion
for /R %%I in (???????????account.txt) do (
set "FileName=%%~nI"
set "NewFileName=MSF!FileName:~9,2!DNB.abc"
if not exist "%%~dpI!NewFileName!" (
ren "%%~fI" "!NewFileName!" 2>nul
if not exist "%%~dpI!NewFileName!" echo Failed to rename file: "%%~fI"
) else (
echo Cannot rename file: "%%~fI"
)
)
endlocal
找到的帐户文本文件的文件名已分配给环境变量FileName
。
通过使用字符串替换和delayed expansion将固定部分MSF
和DNB.abc
与2个字符连接起来来创建文件的新名称。
接下来检查是否已存在具有新名称的文件。这是文件重命名的情况,否则输出错误消息。
重命名文件后,检查是否成功。如果重命名失败,例如由于共享冲突,则输出略有不同的错误。
要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。
echo /?
endlocal /?
for /?
if /?
ren /?
set /?
setlocal /?
另请阅读Microsoft有关Using Command Redirection Operators。
的文章答案 2 :(得分:0)
我可能会按照以下方式执行此操作,前提是要重命名的文件位于给定根目录的直接子目录(YYMM
)中,而不是其他地方:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "_ROOT=." & rem // (specify path to the root directory)
for /D %%D in ("%_ROOT%\????") do (
for %%F in ("%_ROOT%\%%~nxD\R??????????Account.txt") do (
set "FDIR=%%~nxD" & set "FILE=%%~nxF"
setlocal EnableDelayedExpansion
ECHO ren "!_ROOT!\!FDIR!\!FILE!" "MSF!FILE:~9,2!DNB.abc"
endlocal
)
)
endlocal
exit /B
如果要检查文件名的子目录名称和年/月部分是否都是纯数字,可以使用以下脚本:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "_ROOT=." & rem // (specify path to the root directory)
for /F "delims= eol=|" %%D in ('
dir /B /A:D "%_ROOT%\????" ^| ^
findstr "^[0123456789][0123456789][0123456789][0123456789]$"
') do (
for /F "delims= eol=|" %%F in ('
dir /B /A:-D "%_ROOT%\%%~nxD\R??????????Account.txt" ^| ^
findstr "^R....[0123456789][0123456789][0123456789][0123456789].."
') do (
set "FDIR=%%~nxD" & set "FILE=%%~nxF"
setlocal EnableDelayedExpansion
ECHO ren "!_ROOT!\!FDIR!\!FILE!" "MSF!FILE:~9,2!DNB.abc"
endlocal
)
)
endlocal
exit /B
如果要检查子目录名称是否与文件名的年/月(YYMM
)部分匹配,请将模式R??????????Account.txt
替换为R????%%~nxD??Account.txt
(对于这两个脚本) )。
在验证了任一脚本的正确输出后,删除大写ECHO
命令以实际重命名任何文件!
基本上,两个脚本都使用sub-string expansion从文件名中提取标识符部分(KK
)。由于在同一代码块中设置和读取变量,因此需要delayed expansion。第二种方法没有按standard for
loops列出子目录和文件,它使用dir
command,findstr
来过滤它们的名称,使用for /F
loop来捕获结果输出子目录和文件。