批处理文件,用于复制除最新文件之外的所有新文件

时间:2010-08-24 13:17:11

标签: copy batch-file

我想写一个包含DOS命令的批处理文件(遗憾的是perl或其他语言不是一个选项)来执行以下任务。
在一个目录(c:\ MyData \ Directory1)中有以下文件:
FILE2.TXT
File2.DAT的
FileA.bin
FileQ.bin
FileC.bin
File8.bin
File2.bin
这些文件都有不同的创建日期。在此示例中,最近创建的* .bin文件是File2.bin,但它可以是任意随机命名的* .bin文件。

在另一个目录(c:\ MyData \ Directory2)中有以下文件:
FILE2.TXT
File2.DAT的
FileA.bin
FileQ.bin

这是我想做的事:
复制Directory1中扩展名为* .bin但Directory2 中除之外的所有文件,以便在Directory1中最近创建的* .bin文件。因此,应该复制到Directory2的唯一文件是:
FileC.bin - 复制,因为它是一个尚未在Directory2中的bin文件 File8.bin - 复制,因为它是一个尚未在Directory2中的bin文件

以下文件应复制到Directory2中:
File2.txt - 错误的扩展名,所以不要复制它 File2.dat - 错误的扩展名,所以不要复制它 FileA.bin - 已存在于Directory2中,因此请勿复制它 FileQ.bin - 已存在于Directory2中,因此请勿复制它 File2.bin - 最近的* .bin文件,所以不要复制它

感谢您的帮助!

3 个答案:

答案 0 :(得分:3)

@echo off
@rem     Sorry for excessive commenting - I am a batch file newbie
@rem     Batch file will not work if there are spaces in names of directory or copied files
@rem     Next line allows for/do loop to work correctly
setlocal enabledelayedexpansion

@rem     Make temporary file that lists files from newest to oldest
DIR /o-d /b c:\temp\Directory1\*.bin > FileList.txt

@rem     Counter will be used to avoid copying newest file which is listed first
set /A Counter=1

@rem     Read in names of all files with chosen extension in the first directory
@rem     Names will be stored in the variable %%a
for /F "delims=" %%a in (C:\temp\FileList.txt) do (

@rem     Increment the counter
    set /A Counter+=1
@rem     Only copy files that are not the most recent one, so Counter>1
@rem     Requires the exclamation points because this is a string not number comparison
    if !Counter! gtr 1 (
@rem     If the file does not already exist in Directory2, copy it
            if not exist C:\temp\Directory2\%%a (
                    echo Copying C:\temp\Directory1\%%a to C:\temp\Directory2\%%a
                    copy C:\temp\Directory1\%%a C:\temp\Directory2\%%a
            )
    )
)
@rem     Remove the temporary file
del FileList.txt

答案 1 :(得分:0)

您可以使用DIR *.bin /o-d /b > Files.txt获取最近订购的bin文件列表。在两个文件夹上执行此操作(分隔输出文件),然后设置FOR循环,可能是两个嵌套的FOR循环,通过这两个文件,挑选要复制的文件(对日期中的第一个文件进行特殊处理) - 订购列表),并从循环中复制它们。愚蠢的技巧将通过设置属性设置然后使用XCOPY /M同时复制它们来完成,但这似乎过于繁琐。

我总是发现FOR循环是一个脾气暴躁的野兽,如果你能找到非批处理文件的方式,或者某种形式的第三方插件来帮助你,你就会领先于游戏。 / p>

答案 2 :(得分:0)

我的机器上没有Robocopy,否则我会做/?告诉你但我记得它有更多功能(特别是wrt时间戳)。这是一个Windows工具。 http://en.wikipedia.org/wiki/Robocopy