0

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

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

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

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

4

1 回答 1

2

像这样的东西应该工作:

%oldname:~-8%提取最后 8 个字符%oldname%,然后将其附加到新文件名。

更新:如果您可以使用外部程序识别文件,然后使用文件名调用批处理脚本

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_”后跟 8 位数字oldname)分配给变量newname
  • copy "!oldname!" "!newname!"这个不用我解释了吧?
于 2013-02-18T00:18:38.350 回答