使用Dos命令复制文件并在文件名中保留日期

时间:2013-02-18 00:01:49

标签: batch-file copy cmd

我在使用dos命令尝试复制和重命名文件时遇到了麻烦。我有一个格式为myfile20130218的文件,并希望将其复制并重命名为some_other_file_20130218

我知道我可以使用copy source dest,但我在如何隔离日期并保留它方面遇到了麻烦。我不能保证他的约会日期是今天的日期,因此排除了源文件的名称。

我可以运行一系列命令或批处理脚本,但我目前遇到问题的是,在找到我需要复制的匹配项后,使用myfile????????,我现在怎么办?获取那些文件名以从中提取日期?

编辑:为了澄清我将查看已知目录中的文件,如上所述,我将知道文件名的格式,并且只会检查特定目录。检查目录的过程是ConnectDirect文件监视器,因此当找到匹配myfile20130218的文件时,我可以触发一些命令,但不知道如何检查目录并获取文件的名称。

1 个答案:

答案 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!"我不需要解释这个,是吗?