代码之家  ›  专栏  ›  技术社区  ›  Devrin

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

  •  61
  • Devrin  · 技术社区  · 18 年前

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

    8 回复  |  直到 18 年前
        1
  •  64
  •   PabloG    18 年前

    Windows外壳,一个内衬:

    FOR /F %%I IN ('DIR *.* /B /O:-D') DO COPY %%I <<NewDir>> & EXIT
    
        2
  •  122
  •   Chris Magnuson    15 年前

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

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

    现在您可以在BAT文件的其余部分引用%newestfile%。

    例如,我们使用以下方法从目录中获取最新版本的database.bak文件,将其复制到服务器,然后还原数据库:

    :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"
    
        3
  •  10
  •   TimH    15 年前

    要使用空格来处理文件名,需要修改接受答案的版本:

    FOR /F "delims=" %%I IN ('DIR . /B /O:-D') DO COPY "%%I" <<NewDir>> & GOTO :END
    :END
    
        4
  •  3
  •   FutbolFan    8 年前

    @ Chris Noe

    请注意,&前面的空间将成为上一个命令的一部分。 这已经用set咬了我,它很高兴地将尾随空格放入值中。

    要绕过添加到环境变量中的尾随空格,请用parens包装set命令。

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

        5
  •  2
  •   Robert Swisher    18 年前

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

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

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

        6
  •  2
  •   moswald Jarod42    18 年前

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

    显然,用新的文件位置替换新的文件位置。

    @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
    
        7
  •  2
  •   DoTheEvo    11 年前
    @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
    

    我试图从文件夹中复制最新文件

    只需设置源文件夹和目标文件夹,它就可以工作了

    这一个忽略文件夹,只关心文件本身

    建议您在目录路径更改中选择文件类型 *.* 到 *.zip 例如

    我想WinXP不能超时

        8
  •  -2
  •   Kent Fredric    18 年前

    猛击:

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

    其中“newestfile”将成为newestfile

    或者,您可以执行newdir/str或只执行newdir

    击穿:

    1. 以时间文件格式列出所有文件。
    2. 按时间排序
    3. 拿最后一个
    4. 从开始/结束处切断时间和空白
    5. 复制结果值

    重要的

    运行一次之后,最新的文件将是您刚才复制的任何文件:p(假设它们都在相同的搜索范围内)。 因此,如果您希望此操作不止一次,您可能需要调整复制的文件号。

    推荐文章