使用Dos命令复制文件并将文件名保留为
我无法仅使用dos命令复制和重命名文件。我有一个格式为myfile20130218
的文件,并且要将其复制并重命名为some_other_file_20130218
。使用Dos命令复制文件并将文件名保留为
我知道我可以使用copy source dest
但我在如何隔离日期并保留它时遇到问题。我无法保证他的日期将成为今天的日期,因此排除,源文件将永远是相同的名称。
我可以运行一系列命令或批处理脚本,但目前遇到麻烦的事情是在我找到需要复制的匹配项之后,我使用myfile????????
,现在该如何获取这些文件取消日期的名称?
编辑:澄清我将在一个已知的目录中查看文件,如上所述,我将知道文件名的格式,并且只会检查它的特定目录。检查目录的过程是一个ConnectDirect文件观察器,所以当找到一个匹配myfile20130218
的文件时,我可以启动一些命令,但不知道如何检查目录并获取存在文件的名称。
像这样的东西应该工作:
%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!"
我不需要解释这个,对吗?
这就是我想要的,但我的问题是如何使这个通用的,以便我可以'myfile20130218',而不必直接指定如上? – 2013-02-18 01:02:34
@dann你必须在某处指定它,无论是作为参数,文件的内容或任何其他方式来做到这一点。所以,如果你指定了如何得到文件名,我肯定有人会编辑它或者提出一个新的问题。 – 2013-02-18 06:21:39
@ dann.dev你到底在找什么?以字符串“myfile”开头并跟随8位数字的文件?你知道文件的位置吗?请尽可能具体。 – 2013-02-18 10:31:30
Powershell不是一个选项?我认为这很难使用标准的Windows命令行工具。 – Jason 2013-02-18 00:05:15
不,我忘了提到的一件事是,它必须从ConnectDirect脚本运行,所以基本上这个过程会在检测到目录中的匹配文件名时触发。 – 2013-02-18 00:06:33