使用复制将特定文件(基于文件名)从多个目录复制到一个目录,删除时间戳记并保留文件名和扩展名

时间:2019-04-21 07:41:22

标签: batch-file

我正在尝试从1个目录(源)中的2个子目录(存档和归档存储)中复制特定文件(搜索始终基于文件名),并通过保留文件名和文件名将它们复制到另一个目录(SaveHere)扩展,但删除了时间戳。

尝试了以下脚本,但没有用:

copy U:\clients\source\archive\ + U:\clients\source\archivestore\SampleFileName.file__01-02-2019_22-35-11-444_A X:\SaveHere\*.file
copy U:\clients\source\archive\ + U:\clients\source\archivestore\SampleFileName2.file_19-04-2019_20-35-56-676_A X:\SaveHere\*.file
pause

我希望脚本检查两个子目录(存档和归档存储)中的指定文件名(SampleFileName.file_01-02-2019_22-35-11-444_A和SampleFileName2.file_19-04-2019_20-35-56-676_A )以及找到文件的任何位置,然后将其复制到目标目录(X:\SaveHere\,并删除日期戳(_01-02-2019_22-35-11-444_A_19-04-2019_20-35-56-676_A),仅保留带有扩展名的文件名({{1 }}和SampleFileName.file

1 个答案:

答案 0 :(得分:0)

问题不是很清楚。所以我从一个例子开始:

目录id.value包含目录和文件:

  • 存档
    • SampleFileName.file__01-02-2019_22-35-11-444_A
    • SampleFileName2.file_19-04-2019_20-35-56-676_A
  • 档案存储
    • SampleFileName2.file_19-04-2019_20-35-56-676_A

执行批处理文件后,目录U:\clients\source应该包含:

  • SampleFileName.file
  • SampleFileName2.file ... 目录X:\SaveHere中首选。

一个针对此文件复制任务的许多可能解决方案是使用循环:

archive

最外面的 FOR 运行第二次 FOR 的两倍,其中第一个@echo off for %%I in ("SampleFileName.file" "SampleFileName2.file") do ( for %%J in ("U:\clients\source\archivestore" "U:\clients\source\archive") do ( for %%K in ("%%~J\%%~I_*") do copy /Y "%%K" "X:\SaveHere\%%~I" >nul ) ) 和第二个"SampleFileName.file"被分配给循环变量"SampleFileName2.file"

第二个 FOR 运行第三次 FOR 的两倍,其中第一个I和第二个"U:\clients\source\archivestore"被分配给循环变量"U:\clients\source\archive"

因此,第三个 FOR 使用通配符模式总共执行了四次:

  1. J
  2. "U:\clients\source\archivestore\SampleFileName.file_*"
  3. "U:\clients\source\archive\SampleFileName.file_*"
  4. "U:\clients\source\archivestore\SampleFileName2.file_*"

第三个 FOR 搜索与当前通配符模式匹配的非隐藏文件,并为找到的每个文件运行命令 COPY

命令 COPY 将第三个 FOR 找到的文件复制到目录"U:\clients\source\archive\SampleFileName2.file_*",目标文件名由第一个 FOR 定义目前正在使用其循环变量X:\SaveHere,并覆盖了一个I中名称相同的文件。

另一个解决方案是仅使用两个 FOR

X:\SaveHere

第一个 FOR 在目录@echo off for /R "U:\clients\source\" %%I in ("SampleFileName*.file_*") do ( for /F "eol=| delims=_" %%J in ("%%~nxI") do copy /Y "%%I" "X:\SaveHere\%%J" >nul ) 及其所有子目录中递归搜索与模式U:\clients\source匹配的文件,并为找到的文件名分配完整路径,以循环变量{{ 1}},然后执行第二个 FOR

第二个 FOR 仅将带有扩展名且没有路径的文件名作为字符串处理。它使用下划线作为字符串定界符,将文件名字符串拆分为子字符串。仅将第一个下划线分隔的字符串分配给循环变量SampleFileName*.file_*,例如循环变量I和两次J。然后,第二个 FOR 运行命令 COPY ,根据源文件名中的第一个下划线复制具有自动截断的目标文件名的文件。

如果文件名中的日期/时间部分有下划线,则此解决方案不起作用。

此解决方案的缺点在于,在SampleFileName.file的目录树中多次发现的文件顺序不是由批处理文件代码确定的,而是由文件系统返回的,该文件系统返回与first模式匹配的文件名 FOR 循环。

阅读有关Using Command Redirection Operators的Microsoft文章,以获取SampleFileName2.file的解释。

要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读每个命令显示的所有帮助页面。

  • U:\clients\source
  • >nul
  • copy /?
相关问题