【问题标题】:Batch, copy and rename latest file from all subdirectories批量、复制和重命名所有子目录中的最新文件
【发布时间】:2018-11-09 17:18:18
【问题描述】:

我被困在这个脚本上,我正在尝试编写可以完成其中各个部分的脚本,但我似乎无法将它们组合在一起。

在一个文件夹中,有许多包含 .mp4 文件的子文件夹,其中每隔一段时间就会在任何子目录中生成一个新文件。该脚本应该能够遍历每个文件夹,并确定所有文件夹中哪个文件是最新的,并将其复制到指定文件夹,同时将其重命名为“Current.mp4”

到目前为止,我一团糟: 这会将文件复制到子目录中,但不会循环其余部分

REM Copy the most recent database backups from their folders 
@echo off

REM Copy File in one destination to another --------------------------------------------

setlocal
set srcDir=P:\
set destdir=D:\
set lastmod=



pushd %srcDir%
for /f "tokens=*" %%a in ('dir /S *.mp4 /D /b /o-d /a-d /t:c') do set lastmod=%%a
:::
copy "%lastmod%" "%destDir%"

同时这个似乎是循环的,但仅指 .bat 目录中的最新文件。

setlocal
set destdir=D:\
SET srcDir=P:\

pushd %srcDir%

FOR /F "delims=" %%I in ('dir /ad /s') do (
     pushd "%%~I"
     pushd %srcDir%
     FOR /F "delims=*" %%G IN ('DIR *=.mp4 /B /A:-D /O:D') DO SET NewestFile=%%G
     popd
)
popd

:::
copy "%NewestFile%" "%destdir%"

最后重命名我想我可以弄清楚如何做最后一个。我有使用 c++ 的经验,但批处理对我来说相对较新。任何帮助将不胜感激!

谢谢

【问题讨论】:

    标签: batch-file copy-paste batch-rename subdirectory


    【解决方案1】:

    Batch 不擅长对一般属性的文件夹边界进行排序。

    我会为此使用 PowerShell,打包成一批(未经测试):

    :: Q:\Test\2018\11\09\SO_53230483.cmd
    @echo off & setlocal
    set "srcDir=P:\"
    set "destdir=D:\"
    set "lastmod="
    
    For /f "usebackq delims=" %%a in (`
      powershell -NoP -C "(Get-ChildItem -Path '%srcDir%' -Filter '*.mp4' -File -Recurse | Sort-Object LastWriteTime -Descending | Select-Object -First 1).FullName"
    `) Do Set "lastmod=%%a"
    
    If defined lastmod (
       copy "%lastmod%" "%destDir%Current.mp4"
    ) else (
       Echo couldn't obtain lastmod file
    )
    

    【讨论】:

    • 非常感谢!你太棒了,我努力了这么久!我想从现在开始我会更加习惯 powershell 功能。
    【解决方案2】:

    如果您不想使用 PowerShell,可以使用 WMIC:

    @For /F "EOL=L Tokens=1*" %%A In ('
        "WMIC DataFile Where (Drive='P:' And Extension='mp4') Get LastModified,Name 2>Nul|Sort /R"
    ') Do @Call:CopyIt %%B&GoTo :X
    :X
    @Exit/B
    :CopyIt
    @If Not "%*"=="" Copy /Y "%*" "D:\current.mp4"&Exit/B
    

    以上只是一个示例,如果您的源不是驱动器的根目录或者您的文件名包含与号,则需要进行修改。

    【讨论】:

      【解决方案3】:

      还没有,但我已经找到了如何扫描 ONE 目录并在重命名时复制最新文件。我只需要让它扫描所有子目录。

      pushd P:\
      for /f "tokens=*" %%a in ('dir /b /od') do set newest=%%a
      copy "%newest%" "D:\Current.mp4
      popd
      

      【讨论】:

        猜你喜欢
        • 2022-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-18
        • 2013-06-25
        • 2021-12-05
        相关资源
        最近更新 更多