2013-02-18 50 views
0

我无法仅使用dos命令复制和重命名文件。我有一个格式为myfile20130218的文件,并且要将其复制并重命名为some_other_file_20130218使用Dos命令复制文件并将文件名保留为

我知道我可以使用copy source dest但我在如何隔离日期并保留它时遇到问题。我无法保证他的日期将成为今天的日期,因此排除,源文件将永远是相同的名称。

我可以运行一系列命令或批处理脚本,但目前遇到麻烦的事情是在我找到需要复制的匹配项之后,我使用myfile????????,现在该如何获取这些文件取消日期的名称?

编辑:澄清我将在一个已知的目录中查看文件,如上所述,我将知道文件名的格式,并且只会检查它的特定目录。检查目录的过程是一个ConnectDirect文件观察器,所以当找到一个匹配myfile20130218的文件时,我可以启动一些命令,但不知道如何检查目录并获取存在文件的名称。

+0

Powershell不是一个选项?我认为这很难使用标准的Windows命令行工具。 – Jason 2013-02-18 00:05:15

+0

不,我忘了提到的一件事是,它必须从ConnectDirect脚本运行,所以基本上这个过程会在检测到目录中的匹配文件名时触发。 – 2013-02-18 00:06:33

回答

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命令拆分为一半,从而导致无效的命令行。
  • set oldname=%~f1\%%f将匹配文件的完整路径分配给变量oldname
  • set newname=%~f1\my_other_name_!oldname:~-8!将变量newname指定为新文件名(“my_other_name_”,后面跟着从后面8位数字从oldname)的完整路径。
  • copy "!oldname!" "!newname!"我不需要解释这个,对吗?
+0

这就是我想要的,但我的问题是如何使这个通用的,以便我可以'myfile20130218',而不必直接指定如上? – 2013-02-18 01:02:34

+1

@dann你必须在某处指定它,无论是作为参数,文件的内容或任何其他方式来做到这一点。所以,如果你指定了如何得到文件名,我肯定有人会编辑它或者提出一个新的问题。 – 2013-02-18 06:21:39

+0

@ dann.dev你到底在找什么?以字符串“myfile”开头并跟随8位数字的文件?你知道文件的位置吗?请尽可能具体。 – 2013-02-18 10:31:30

相关问题