我在使用dos命令尝试复制和重命名文件时遇到了麻烦。我有一个格式为myfile20130218
的文件,并希望将其复制并重命名为some_other_file_20130218
。
我知道我可以使用copy source dest
,但我在如何隔离日期并保留它方面遇到了麻烦。我不能保证他的约会日期是今天的日期,因此排除了源文件的名称。
我可以运行一系列命令或批处理脚本,但我目前遇到问题的是,在找到我需要复制的匹配项后,使用myfile????????
,我现在怎么办?获取那些文件名以从中提取日期?
编辑:为了澄清我将查看已知目录中的文件,如上所述,我将知道文件名的格式,并且只会检查特定目录。检查目录的过程是ConnectDirect文件监视器,因此当找到匹配myfile20130218
的文件时,我可以触发一些命令,但不知道如何检查目录并获取文件的名称。
答案 0 :(得分:2)
这样的事情应该有效:
%oldname:~-8%
从%oldname%
中提取最后8个字符,然后将这些字符附加到新文件名中。
更新:如果您可以使用外部程序识别文件,然后使用文件名调用批处理脚本
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
命令有效地分成两半,从而导致命令无效-line。set oldname=%~f1\%%f
将匹配文件的完整路径分配给变量oldname
。set newname=%~f1\my_other_name_!oldname:~-8!
将新文件名的完整路径(“my_other_name_”后跟oldname
后面的8位数字)分配给变量newname
。copy "!oldname!" "!newname!"
我不需要解释这个,是吗?