像这样的东西应该工作:
%oldname:~-8%
提取最后 8 个字符%oldname%
,然后将其附加到新文件名。
更新:如果您可以使用外部程序识别文件,然后使用文件名调用批处理脚本
copyfile.cmd C:\path\to\myfile20130218
你可以这样做:
set oldname=%~nx1
set newname=%~dp1some_other_file_%oldname:~-8%
copy "%~f1" "%newname%"
更新 2:如果您知道文件夹和格式,您可以使用文件夹调用脚本
copyfile.cmd C:\folder
并做这样的事情:
@echo off
setlocal EnableDelayedExpansion
for /f %%f in (
'dir /b "%~f1" ^| findstr /r "myfile[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]$"'
) do (
set oldname=%~f1\%%f
set newname=%~f1\my_other_name_!oldname:~-8!
copy "!oldname!" "!newname!"
)
endlocal
编辑:脚本分解。
setlocal EnableDelayedExpansion
启用循环和条件内的变量扩展。
for /f %%f in ('...')
执行单引号之间的命令,然后循环该命令的输出。
dir /b "%~f1"
以简单模式(无标题,无摘要)列出给定目录的内容(%~f1
扩展为传递给脚本的第一个参数的完整路径)。
findstr /r "myfile[0-9]...[0-9]$"
过滤以子字符串“myfile”后跟 8 位数字结尾的字符串的输入。管道 ( ^|
) 之前的抑扬符转义管道,因为否则它将优先于for
命令,这将有效地将for
命令分成两半,导致命令行无效。
set oldname=%~f1\%%f
将匹配文件的完整路径分配给变量oldname
。
set newname=%~f1\my_other_name_!oldname:~-8!
将新文件名的完整路径(“my_other_name_”后跟 8 位数字oldname
)分配给变量newname
。
copy "!oldname!" "!newname!"
这个不用我解释了吧?