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

我需要将目录中的最新文件复制到新位置。到目前为止,我已经找到了关于 档案命令的资源,这里是一个 关于约会的问题,另一个 相关问题。我只是想不通!如何将该目录中的最新文件复制到新位置?

199337 次浏览

我知道你要的是 Windows,但我还是想加上这个,在 Unix/Linux 中你可以这样做:

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

它将列出按修改时间排序的工作目录中的所有文件,然后将最近的文件 cp 到/somdir/

这将打开第二个 cmd.exe 窗口。

显然,可以将 new _ file _ loc 替换为您的新文件位置。

@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

巴斯:

 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 }{ file }格式列出所有文件。
  2. 按时间分类
  3. 抓住最后一个
  4. 从开始/结束切断时间和空格
  5. 复制结果值

重要

运行一次之后,最新的文件将是您刚刚复制的任何文件: p (假设它们都在相同的搜索范围内)。 因此,如果您希望这个工作多次,您可能必须调整您复制的文件编号。

Windows 外壳,一行:

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

接受的答案提供了在命令中使用最新文件然后退出的示例。如果您需要在 bat 文件中使用其他复杂操作来实现这一点,可以使用以下方法将最新文件的文件名存储在一个变量中:

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

现在,您可以在蝙蝠文件的其余部分中引用 %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

@ Chris Noe

注意,& 前面的空格成为前面命令的一部分。 SET 让我吃了一惊,它很高兴地将尾随空格放入值中。

要绕过添加到环境变量的尾部空间,请用括号括起 set 命令。

例如 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

从文件夹复制最新文件的尝试

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

这个程序忽略文件夹,只关心文件

建议您在 DIR 路径中选择文件类型,例如将 *.*更改为 *.zip

我认为在 WinXP 上不能使用 TIMEOUT

将大多数基于 date的最新文件从一个目录复制到另一个目录

echo off
rem copying latest file with current date from one folder to another folder
cls
echo Copying files. Please wait...
:: echo Would you like to do a copy?
rem pause
for /f "tokens=1-4 delims=/ " %%i in ("%date%") do (
set dow=%%i
set month=%%j
set day=%%k
set year=%%l
)
:: Pad digits with leading zeros e.g Sample_01-01-21.csv
set yy=%year:~-2%
:: Alternate way - set datestr=%date:~0,2%-%date:~3,2%-%date:~6,2%
set datestr=%day%-%month%-%yy%
:: echo "\\networkdrive\Test\Sample_%datestr%.csv"
rem copy files from src to dest e.g copy <src path> <dest path>
copy "D:\Source\Sample_%datestr%.csv" D:\Destination
echo Completed
rem pause

以上代码使用 .bat文件格式并根据需要更改目录,然后运行 batch文件。

前面的答案比较了修改日期和非创建日期。下面是一个基于创建日期和时间进行比较的脚本示例:

set origFolderPath=..\Source\Customization.Solution
set distFolderPath=.\PublishCustomization.Solution


FOR /F "tokens=*" %%I IN ('DIR "%origFolderPath%\*.zip" /T:C /B /O:D') DO SET "NewestFile=%%I"
copy %origFolderPath%\%NewestFile%  %distFolderPath%

技巧在于,在以前的答案中使用的/A-D 检查修改日期,如果你对从源代码控制系统(如 tfs)抓取的文件运行脚本,那么所有编辑过的文件的修改日期都是一样的,然后就会得到一个错误的答案。/T: C 比较创建日期时间,而这在这种情况下可能是一种解决方案。