首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用copy将特定文件(基于文件名)从多个目录复制到一个目录,删除时间戳并保留文件名和扩展名

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

Stack Overflow用户
提问于 2019-04-21 15:41:22
回答 1查看 30关注 0票数 0

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

尝试了以下脚本,但不起作用:

代码语言:javascript
复制
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),只保留带扩展名的文件名(SampleFileName.file和SampleFileName2.file)

EN

回答 1

Stack Overflow用户

发布于 2019-04-21 16:53:08

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

目录U:\clients\source包含目录和文件:

  • archive
    • SampleFileName.file__01-02-2019_22-35-11-444_A
    • SampleFileName2.file_19-04-2019_20-35-56-676_A

​

  • archivestore
    • SampleFileName2.file_19-04-2019_20-35-56-676_A

​

批处理文件执行后,目录X:\SaveHere应包含:

  • SampleFileName.file
  • SampleFileName2.file ...首选来自目录archive.

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

代码语言:javascript
复制
@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"分配给循环变量I。

的第二个运行两次的第三个,并将第一个"U:\clients\source\archivestore"和第二个"U:\clients\source\archive"分配给循环变量J。

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

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

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

命令COPY将第三个找到的文件复制到目录X:\SaveHere,目标文件名由当前分配给其循环变量I的第一个FOR定义,并覆盖X:\SaveHere中可能已存在的同名文件。

对于另一个解决方案,仅使用两个

代码语言:javascript
复制
@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及其所有子目录中以递归方式搜索与模式SampleFileName*.file_*匹配的文件,并在执行第二个 for 之前将找到的文件名与完整路径分配给循环变量I。

的第二个处理为字符串,只处理带文件扩展名的文件名,不带路径。它使用下划线作为字符串分隔符,将文件名字符串拆分成子字符串。只将第一个下划线分隔的字符串分配给循环变量J,在本例中,该变量是一次SampleFileName.file和两次SampleFileName2.file。然后,的第二个运行命令 copy ,根据源文件名中的第一个下划线,使用自动截断的目标文件名复制文件。

如果文件名中的日期/时间部分留有下划线,则此解决方案无效。

这种解决方案的缺点是,在U:\clients\source的目录树中多次找到的文件的顺序不是由批处理文件代码确定的,而是由文件系统确定的,该文件系统返回与第一个FOR循环的模式匹配的文件名。

有关>nul的解释,请阅读微软关于Using Command Redirection Operators的文章。

要了解所使用的命令及其工作原理,请打开命令提示符窗口,在那里执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。

  • copy /?
  • echo /?
  • for /?
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55780874

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档