标题: [文件操作] [已解决]对批处理所在根目录下指定文件类型进行备份 [打印本页]
作者: jave000 时间: 2024-7-5 12:06 标题: [已解决]对批处理所在根目录下指定文件类型进行备份
本帖最后由 jave000 于 2024-7-5 13:51 编辑
双击后,识别程序运行所在根目录文件夹内,指定的几个文件类型,比如jpg和pdf,其他类型不管,且修改日期为今天的,其他日期不管,将其备份到指定新建备份子目录内,并给备份文件加入修改日期后缀,格式为07052024,与源文件名连接符为“_"
作者: Batcher 时间: 2024-7-5 12:19
回复 1# jave000
大家对于“根目录”的理解各不相同,请发个图片举例看看:
- 脚本在哪里
- 待备份的文件在哪里
- 新建备份文件夹在哪里
如果需要上传截图,可以找个图床,例如:
http://bbs.bathome.net/thread-60985-1-1.html
作者: ppll2030 时间: 2024-7-5 12:44
本帖最后由 ppll2030 于 2024-7-5 13:42 编辑
保存为bat文件,放在根目录下,
增加修改日期判定是否为当天- @echo off
- if not exist backup md backup
- for /f "delims=" %%i in ('dir /b/a-d *.jpg *.pdf') do (
- for /f "delims= " %%a in ("%%~ti") do (
- if "%%a" == "%date%" copy "%%i" "backup\%%~ni_%date:~5, 2%%date:~8, 2%%date:~0, 4%%%~xi"
- )
- )
- pause&exit
复制代码
作者: jave000 时间: 2024-7-5 13:11
回复 2# Batcher
抱歉版主,标题写了,正文忘写了,是程序所在目录下
作者: microsoft_yaw 时间: 2024-7-5 13:13
- @echo off & setlocal enabledelayedexpansion
-
- set "list=jpg pdf"
- if not exist "%~dp0Backup" (mkdir "%~dp0Backup")
- for /f "tokens=3 delims=/ " %%i in ("!date!") do (set "today_date=%%i")
- for /f "tokens=1,2,3 delims=/ " %%i in ("!date!") do (set "new_name=%%j%%k%%i")
- for /f "skip=4 tokens=1,4,* delims= " %%a in ('dir /od') do (
- for /f "tokens=3 delims=/" %%i in ("%%a") do (set "file_date=%%i")
- if "!file_date!" equ "!today_date!" (
- for /f "delims=" %%i in ("%%b %%c") do (
- for %%f in (!list!) do (
- if "%%~xi" equ ".%%f" (
- copy /y "%%i" "%~dp0Backup" >nul && ren "%~dp0Backup\%%i" "%%~ni_!new_name!%%~xi"
- )
- )
- )
- )
- )
-
- pause
复制代码
仅支持备份Bat程序当前位置中指定类型的文件
作者: jave000 时间: 2024-7-5 13:15
回复 3# ppll2030
谢谢,这个没有判断指定类型的文件是否是今天的修改日期
作者: jave000 时间: 2024-7-5 13:24
回复 5# microsoft_yaw
正常运行,出现过一次同时备份了原文件和加了后缀的原文件,俩都在,看不出为啥。其他时候测试都正常。非常感谢
作者: aloha20200628 时间: 2024-7-5 13:37
本帖最后由 aloha20200628 于 2024-7-5 13:43 编辑
回复 1# jave000 - @echo off &setlocal enabledelayedexpansion
- if not exist "新建备份" md "新建备份"
- for /f "delims=" %%F in ('dir /b/a-d *.jpg *.pdf') do (set "t=%%~tF"&if "%date%"=="!t:~,10!" copy /y "%%F" "新建备份\%%~nF_!t:~5,2!!t:~8,2!!t:~,4!%%~xF")
- endlocal&pause&exit
复制代码
作者: ppll2030 时间: 2024-7-5 13:43
回复 6# jave000
2楼已修改,增加了对文件修改日期识别是否为当日。
作者: microsoft_yaw 时间: 2024-7-5 13:43
回复 7# jave000
已优化:- @echo off & setlocal enabledelayedexpansion
-
- set "list=jpg pdf"
- if not exist "%~dp0Backup" (mkdir "%~dp0Backup")
- for /f "tokens=1,2,3 delims=/ " %%i in ("!date!") do (set "today_date=%%k" & set "new_name=%%j%%k%%i")
- for /f "skip=4 tokens=1,4,* delims= " %%a in ('dir /od') do (
- for /f "tokens=3 delims=/" %%i in ("%%a") do (set "file_date=%%i")
- if "!file_date!" equ "!today_date!" (
- for /f "delims=" %%i in ("%%b %%c") do (
- for %%f in (!list!) do (
- if "%%~xi" equ ".%%f" (
- if not exist "%~dp0Backup\%%~ni_!new_name!%%~xi" (
- copy /y "%%i" "%~dp0Backup" >nul && echo 备份 %%i 成功^^!
- ren "%~dp0Backup\%%i" "%%~ni_!new_name!%%~xi" && echo 重命名 %%i -^> %%~ni_!new_name!%%~xi 成功^^!
- ) else (echo %%~ni_!new_name!%%~xi 已存在,备份失败^^!)
- )
- )
- )
- )
- )
-
- pause
复制代码
如出现乱码,请将Bat程序的编码格式修改为ANSI
作者: 77七 时间: 2024-7-5 13:46
- @echo off
- cd /d "%~dp0"
- set "f=d:\new"
- md "%f%" 2>nul
- for /f %%a in ('wmic os get localdatetime ^|findstr [0-9]') do (
- set today=%%a
- )
- for /f "delims=" %%i in ('dir /b /a-d *.jpg *.pdf') do (
- if "%%~ti" geq "%today:~0,4%/%today:~4,2%/%today:~6,2% 00:00" (
- copy "%%i" "%f%\%%~ni_%today:~0,4%%today:~4,2%%today:~6,2%%%~xi"
- )
- )
- pause
复制代码
作者: jave000 时间: 2024-7-5 13:49
回复 8# aloha20200628
没有备份文件出现
作者: aloha20200628 时间: 2024-7-5 14:23
本帖最后由 aloha20200628 于 2024-7-5 15:15 编辑
回复 12# jave000
系统默认%%~tF是取自文件修改时间戳,for循环还可简化一步...用以下代码模拟楼主一楼示例条件已测试通过
在本批所在目录中创建 “新建备份” 子目录,并获取全部目标文件*.jpg *.pdf,检查每个文件的修改时间戳是否与当日相同,是则复制到 “新建备份” 子目录中...
- @echo off &setlocal enabledelayedexpansion
- if not exist "新建备份" md "新建备份"
- for %%F in (*.jpg *.pdf) do (set "t=%%~tF"&if "%date:~,10%"=="!t:~,10!" copy /y "%%F" "新建备份\%%~nF_!t:~5,2!!t:~8,2!!t:~,4!%%~xF")
- endlocal&pause&exit/b
复制代码
作者: 77七 时间: 2024-7-5 14:28
直接用%date%,在不同代码页下结果不相同。这个帖子中的方法获取日期挺好的,【方案汇总】批处理标准化获取当前系统日期时间
作者: aloha20200628 时间: 2024-7-5 14:40
回复 14# 77七
win8.1简中系统》改变chcp 936或chcp 65001对%date%返回值没有影响
作者: 77七 时间: 2024-7-5 14:47
本帖最后由 77七 于 2024-7-5 14:50 编辑
回复 15# aloha20200628
感谢大佬分享!我是在win10测试的。win8.1的%date%值不包含周几吗,为什么都是直接与 %%~ti部分值比较...
作者: aloha20200628 时间: 2024-7-5 14:56
本帖最后由 aloha20200628 于 2024-7-5 15:05 编辑
回复 16# 77七
楼主要的是文件修改时间与当日比对,而%%~tF正好取自文件修改时间戳
作者: 77七 时间: 2024-7-5 15:02
回复 17# aloha20200628
不明白...这样怎么比较相等。
作者: aloha20200628 时间: 2024-7-5 15:10
本帖最后由 aloha20200628 于 2024-7-5 15:11 编辑
回复 18# 77七
win8.1》
%date%=2024-07-05
%%~tF=2024-07-05 15:08 取其前10位正好
作者: jave000 时间: 2024-7-5 15:11
回复 13# aloha20200628
谢谢,很精简,我本地盘测试未生成备份文件
作者: aloha20200628 时间: 2024-7-5 15:20
回复 20# jave000
已订正了13楼代码,兼容win8.1-win10默认的简中码页(936),楼主的系统若是win10简中系统默认的936码页,再试一下13楼代码应该可以了
作者: aloha20200628 时间: 2024-7-5 15:32
本帖最后由 aloha20200628 于 2024-7-5 16:32 编辑
回复 18# 77七
win8.1 码页=936》
%date% 短日期格式返回值 2024-07-05
%%~tF 返回值 2024-07-05 15:08
win10 码页=936》
%date% 长日期返回值 2024-07-05 周五
%%~tF 返回值 2024-07-05 15:08
批处代码要兼容不同系统的日期长短格式返回值,%date%也要被切取前10位再用,13楼代码已据此订正了,以便兼容win8.1-10的936码页实况...
作者: 77七 时间: 2024-7-5 15:57
回复 22# aloha20200628
差异确实挺大的,不过自用,自己明白完全没问题。
作者: aloha20200628 时间: 2024-7-5 16:21
回复 23# 77七
回看了一下系统对日期的设置选项,有长和短不同日期格式的选取,其结果会影响批处%date%变量的返回值格式,而日期长格式中确有 ‘2014-07-05 周五’ 两个字段的选项...
所以,要看最终用户的具体选择结果了
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |