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

时间:2008-09-18 21:52:05

标签: batch-file forfiles

我需要将目录中的最新文件复制到新位置。到目前为止,我已经在forfiles命令上找到了资源,date-related question在这里,另一个related question。我只是把这些碎片放在一起有点麻烦!如何将该目录中的最新文件复制到新位置?

9 个答案:

答案 0 :(得分:124)

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

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"

答案 1 :(得分:67)

Windows shell,一个班轮:

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

答案 2 :(得分:11)

要允许此操作使用空格处理文件名,需要修改已接受答案的版本:

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

答案 3 :(得分:3)

@Chris Noe

  

注意前面的空间和&amp;成为上一个命令的一部分。   这让我厌倦了SET,它很乐意将尾随空白放入值中。

要绕过添加到环境变量的尾部空间,请将set命令包装在parens中。

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

答案 4 :(得分:2)

我知道你问过Windows,但我想我会添加这个,无论如何,你可以在Unix / Linux中做到:

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

其中将列出当前目录中按修改时间排序的所有文件,然后将最近的cp列为/ somedir /

答案 5 :(得分:2)

这将打开第二个cmd.exe窗口。如果您想要它消失,请用/ C替换/ K.

显然,将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

答案 6 :(得分:2)

@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

TIMEOUT不会在winXP上运行我认为

答案 7 :(得分:0)

将基于 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

Save 使用 .bat 文件格式的上述代码并根据需要更改目录并运行 batch 文件。

答案 8 :(得分:-2)

击:

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

其中“newestfile”将成为最新文件

或者,您可以执行newdir / STR或newdir

细分:

  1. 以{time} {file}格式列出所有文件。
  2. 按时间排序
  3. 得到最后一个
  4. 切断时间,从开头/结尾开始空白
  5. 复制结果值
  6. 重要

    运行一次之后,最新的文件将是您刚刚复制的内容:p(假设它们都在同一个搜索范围内)。 因此,如果您希望多次使用,则可能需要调整复制的文件编号。

相关问题