如何编写Windows批处理脚本以从目录中复制最新的文件?

我需要将最新的文件复制到一个新的位置。 到目前为止,我在forfiles命令中find了资源,这里是一个与 date有关的问题 ,还有另外一个相关的问题 。 我只是有点麻烦拼凑在一起! 如何将该目录中的最新文件复制到新的位置?

Windowsshell,一个内胆:

FOR /F %%I IN ('DIR *.* /B /O:-D') DO COPY %%I <<NewDir>> & EXIT 

接受的答案给出了一个在命令中使用最新文件然后退出的例子。 如果需要在具有其他复杂操作的bat文件中执行此操作,可以使用以下命令将最新文件的文件名存储在variables中:

 FOR /F "delims=|" %%I IN ('DIR "*.*" /B /O:D') DO SET NewestFile=%%I 

现在你可以在你的bat文件的其余部分引用%NewestFile%。

例如,下面是我们用来从目录中获取数据库.bak文件的最新版本,将其复制到服务器,然后恢复db:

 :Variables SET DatabaseBackupPath=\\virtualserver1\Database Backups echo. echo Restore WebServer Database FOR /F "delims=|" %%I IN ('DIR "%DatabaseBackupPath%\WebServer\*.bak" /B /O:D') DO SET NewestFile=%%I copy "%DatabaseBackupPath%\WebServer\%NewestFile%" "D:\" sqlcmd -U <username> -P <password> -d master -Q ^ "RESTORE DATABASE [ExampleDatabaseName] ^ FROM DISK = N'D:\%NewestFile%' ^ WITH FILE = 1, ^ MOVE N'Example_CS' TO N'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Example.mdf', ^ MOVE N'Example_CS_log' TO N'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Example_1.LDF', ^ NOUNLOAD, STATS = 10" 

为了使这个文件名和空格一起工作,需要修改接受的答案:

 FOR /F "delims=" %%I IN ('DIR . /B /O:-D') DO COPY "%%I" <<NewDir>> & GOTO :END :END 

我知道你问了Windows,但是我想在Unix / Linux中添加这个,你可以这样做:

 cp `ls -t1 | head -1` /somedir/ 

其中将按修改时间sorting当前目录中的所有文件,然后cp最近到/ somedir /

这将打开第二个cmd.exe窗口。 如果您希望它消失,请用/ Creplace/ K。

显然,将new_file_locreplace为新的文件位置。

 @echo off for /F %%i in ('dir /B /O:-D *.txt') do ( call :open "%%i" exit /B 0 ) :open start "window title" "cmd /K copy %~1 new_file_loc" exit /B 0 

@Chris Noe

请注意,&前面的空格成为前一个命令的一部分。 那让SET感到困扰的是SET,它乐于把尾随的空白放进去。

为了解决被添加到环境variables的尾部空间,将set命令包装在parens中。

例如,FOR / F %% I IN('DIR' “/ B / O:D')DO(SET NewestFile = %% I)

 @echo off set source="C:\test case" set target="C:\Users\Alexander\Desktop\random folder" FOR /F "delims=" %%I IN ('DIR %source%\*.* /A:-D /O:-D /B') DO COPY %source%\"%%I" %target% & echo %%I & GOTO :END :END TIMEOUT 4 

我试图从一个文件夹复制最新的文件

只需设置您的源文件夹和目标文件夹,它应该工作

这一个忽略文件夹,只关心自己的文件

build议您在DIRpath中select文件types,例如将*.*改为*.zip

TIMEOUT不会在winXP上工作我想

击:

  find -type f -printf "%T@ %p \n" \ | sort \ | tail -n 1 \ | sed -r "s/^\S+\s//;s/\s*$//" \ | xargs -iSTR cp STR newestfile 

“最新文件”将成为最新的文件

或者,你可以做newdir / STR或者只是newdir

分解:

  1. 以{time} {文件}格式列出所有文件。
  2. 按时间sorting
  3. 得到最后一个
  4. 切断时间,并从开始/结束空白
  5. 复制结果值

重要

运行一次后,最新的文件将是你刚刚复制的任何东西:p(假设它们都在相同的search范围内)。 所以你可能不得不调整你复制的文件编号,如果你想这个工作多次。