【问题标题】:Use Dos commands to copy file and preserve date in file name使用 Dos 命令复制文件并在文件名中保留日期
【发布时间】:2013-02-18 00:01:48
【问题描述】:

我在尝试仅使用 dos 命令复制和重命名文件时遇到问题。我有一个myfile20130218 格式的文件,想复制并重命名为some_other_file_20130218

我知道我可以使用copy source dest,但我在如何隔离和保存日期方面遇到了麻烦。我不能保证他的日期是今天的日期,所以排除了,源文件总是同名的。

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

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

【问题讨论】:

  • Powershell 不是一个选项?我认为仅使用标准的 Windows 命令行工具会很困难。
  • 不,我忘记提到的一件事是,这将是必须从 ConnectDirect 脚本运行的东西,所以基本上是一个进程,当它检测到目录中的匹配文件名时会触发。

标签: batch-file copy cmd


【解决方案1】:

这样的事情应该可以工作:

%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! 将新文件名的完整路径(“my_other_name_”后跟 oldname 的尾随 8 位数字)分配给变量 newname
  • copy "!oldname!" "!newname!"这个不用我解释了吧?

【讨论】:

  • 这就是我想要的,但我的问题是如何使这个通用,以便我可以得到 'myfile20130218' 而不必像上面那样直接指定它?
  • @dann 您必须在某处指定它,作为参数、文件内容或任何其他方式来执行它。所以,如果你指定你希望它如何获取文件名,我相信有人会编辑它或提出一个新问题。
  • @dann.dev 您到底在寻找什么?以字符串“myfile”开头后跟 8 位数字的文件?你知道文件的位置吗?请尽可能具体。
  • 很抱歉,如上所述,我知道文件名格式,并且只会检查单个目录。当找到与myfile???????? 匹配的文件时,将调用该过程。
  • @AnsgarWiechers 抱歉,我不知道文件名,只知道文件所在的目录和名称的格式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-11
  • 2012-04-06
相关资源
最近更新 更多