找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 901|回复: 5

[文本处理] 自动备份文件

[复制链接]
发表于 2026-3-28 23:38:07 | 显示全部楼层 |阅读模式
大家好,文件夹d:\123  里面有很多自动产生的mp4文件,帮忙写一段批处理,只要mp4文件产生时间超过1分钟,则自动从d:\123 备份到  D:\456(按照日期文件夹存放),谢谢咯
发表于 2026-3-29 05:27:30 | 显示全部楼层
  1. @echo off
  2. setlocal enabledelayedexpansion

  3. set "SRC=d:\123"
  4. set "DST=D:\456"

  5. if not exist "%DST%" md "%DST%"

  6. for %%f in ("%SRC%\*.mp4") do (
  7.    set "FILE=%%~ff"
  8.    set "NAME=%%~nxf"

  9.    powershell -NoProfile -Command ^
  10.        "$f='%%~ff';" ^
  11.        "$age=(Get-Date)-(Get-Item $f).CreationTime;" ^
  12.        "if($age.TotalSeconds -gt 60){exit 0}else{exit 1}"

  13.    if !errorlevel! equ 0 (
  14.        for /f "tokens=1-3 delims=/ " %%a in ('powershell -NoProfile -Command ^
  15.            "(Get-Item '%%~ff').CreationTime.ToString('yyyy/MM/dd')"') do (
  16.            set "DATEDIR=%%a%%b%%c"
  17.        )

  18.        if not exist "%DST%\!DATEDIR!" md "%DST%\!DATEDIR!"

  19.        if not exist "%DST%\!DATEDIR!\!NAME!" (
  20.            copy /y "%%~ff" "%DST%\!DATEDIR!\!NAME!" >nul
  21.        )
  22.    )
  23. )

  24. endlocal
复制代码
发表于 2026-3-29 11:53:16 | 显示全部楼层
ai答案:


  1. @echo off
  2. set "srcDir=D:\123"
  3. set "dstDir=D:\456"

  4. :loop
  5. cls
  6. echo [%date% %time%] 基于归档位的高效扫描中...

  7. :: 使用 PowerShell 处理:只筛选 [有归档位] 且 [超过1分钟] 的文件
  8. powershell -NoProfile -Command ^
  9.     "$limit = (Get-Date).AddMinutes(-1);" ^
  10.     "Get-ChildItem -Path '%srcDir%' -Filter *.mp4 | Where-Object { ($_.Attributes -band [System.IO.FileAttributes]::Archive) -and ($_.LastWriteTime -lt $limit) } | ForEach-Object {" ^
  11.         "$dateDir = Join-Path '%dstDir%' $_.LastWriteTime.ToString('yyyy-MM-dd');" ^
  12.         "if (!(Test-Path $dateDir)) { New-Item -ItemType Directory -Path $dateDir -Force | Out-Null };" ^
  13.         "Copy-Item -Path $_.FullName -Destination $dateDir -Force;" ^
  14.         "$_.Attributes = $_.Attributes -bxor [System.IO.FileAttributes]::Archive;" ^
  15.         "Write-Host '成功备份并重置归档位: ' $_.Name -ForegroundColor Cyan" ^
  16.     "}"

  17. echo.
  18. echo 待命中... 1分钟后再次检查。
  19. timeout /t 60 /nobreak
  20. goto loop
复制代码

1. 为什么要用“归档位”?
目前的脚本每次运行(每分钟一次)都会去扫描 D:\123 下的所有 MP4 文件。

现状:如果文件夹里有 1000 个老文件,脚本每次都要对比这 1000 个文件的修改时间,然后再去目标文件夹检查这 1000 个文件是否已经存在。

后果:随着时间推移,旧文件越来越多,脚本运行会越来越慢,占用 CPU 和硬盘 IO 也会变高。

2. 什么是“归档位” (Archive Attribute)?
Windows 文件系统(NTFS)为每个文件都自带了一个隐藏的标记,叫做 Archive (A) 属性。

当你新建或修改一个文件时,Windows 会自动把这个标记设为 On(打上勾)。

我们可以让脚本在复制完文件后,手动把这个标记设为 Off(去掉勾)。

下次扫描时:脚本只看那些“带勾”的文件。已经复制过的“没勾”文件会被直接无视,哪怕它还在原文件夹里。

3. 优化后的脚本(带“归档位”识别)
这个版本性能极佳,即使 D:\123 里堆积了上万个文件,它也只处理新产生的那些。

4. 核心变化解析:
筛选条件变了:

($_.Attributes -band [System.IO.FileAttributes]::Archive):这句是核心。它只找那些“属性里包含归档位”的文件。

操作完成后“撕掉标签”:

$_.Attributes = $_.Attributes -bxor [System.IO.FileAttributes]::Archive:复制成功后,通过异或运算把文件的归档位去掉。

极速对比:

现在 PowerShell 不需要再去目标文件夹检查文件是否存在了,只要看到文件没有归档位,它就直接跳过,速度提升几十倍。

⚠️ 注意事项:
手动干预:如果你手动修改了 D:\123 里的某个老文件,Windows 会自动重新给它打上“归档位”,脚本就会认为它是新文件,再次备份它。这其实也是一种变相的“增量备份”。

初次运行:第一次运行此脚本时,它会把 D:\123 里所有超过 1 分钟的文件都备份一遍并清除标记。


发表于 2026-3-29 14:39:34 | 显示全部楼层
本帖最后由 aloha20200628 于 2026-3-29 17:09 编辑

给一个 '一次性备份' bat+powershell 混编版本如下,代码存为 a.bat 运行,若 *.mp4 也要包含子目录中的目标文件,可将代码第5行中的 dir -file *.mp4 改为 dir -r -file *.mp4 即可。

  1. <# ::
  2. @echo off &setlocal &cd /d "d:\123"
  3. powershell -nop -c "iex(${%~f0}|out-string)" &pause&exit/b
  4. #>
  5. $t0=get-date; dir -file *.mp4 |%{
  6.    if (($t0 - $_.creationTime).totalSeconds -lt 60) {continue}
  7.    $d='d:\456\'+$_.creationtime.ToString('yyyy-MM-dd'); md -force $d >$null
  8.    copy $_.fullname -des $d -force }
  9. exit
复制代码
发表于 2026-3-30 08:35:34 | 显示全部楼层
有几个细节需要确认:
1. 备份是指移动还是复制?
2. 有一个文件XYZ.mp4创建日期是2026-03-28已经被成功备份到D:\456\2026-03-28文件夹下,但是原文件在2026-03-29被更新了,那么是否需要备份到D:\456\2026-03-29文件夹下?之前D:\456\2026-03-28文件夹下的老备份是否需要清理掉呢?
3. “产生时间超过1分钟”这个需求是不是为了防止复制命令执行的一瞬间,某一个mp4文件正在生成中,但是还没有生成完,楼主测试上面的几个代码是否遇到了这个问题呢?
发表于 2026-3-30 10:44:41 | 显示全部楼层
本帖最后由 aloha20200628 于 2026-3-30 11:00 编辑

   楼主所谓的自动备份应该是一种动态处理,即在备份过程中,那个产生 *.mp4 文件的项目并未停止,例如将某个网站连续产生的临时文件 *.mp4 及时复制到指定目录,否则,启动备份脚本处理一堆 '早已存在' 的文件,其所谓超过一分钟的比对条件基本毫无意义,其结果等同于将其直接复制到对应的日期目录中而已。
   以上提供 '一次性备份' 脚本代码仅供参考,最终还须使用者根据真实情况增设或包裹一个循环体和设定终止(退出)条件。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-4-21 17:06

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表