我试图从位于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),只保留带扩展名的文件名(SampleFileName.file和SampleFileName2.file)
发布于 2019-04-21 16:53:08
这个问题不是很清楚。所以我从一个例子开始:
目录U:\clients\source包含目录和文件:
批处理文件执行后,目录X:\SaveHere应包含:
archive.此文件复制任务的许多可能解决方案之一是使用循环:
@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。
因此,的第三个使用通配符模式总共执行了四次:
"U:\clients\source\archivestore\SampleFileName.file_*""U:\clients\source\archive\SampleFileName.file_*""U:\clients\source\archivestore\SampleFileName2.file_*""U:\clients\source\archive\SampleFileName2.file_*"的第三个将搜索与当前通配符模式匹配的非隐藏文件,并为找到的每个文件运行命令COPY。
命令COPY将第三个找到的文件复制到目录X:\SaveHere,目标文件名由当前分配给其循环变量I的第一个FOR定义,并覆盖X:\SaveHere中可能已存在的同名文件。
对于另一个解决方案,仅使用两个
@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 /?https://stackoverflow.com/questions/55780874
复制相似问题