zoukankan      html  css  js  c++  java
  • [批处理]自动按日期重命名文件名

    简述:

    最近在整理我爷爷拍的相片,大多是在02-06年间拍的相片

    但是在整理起来发现难度很大,因为我爷爷的相机是联想很早很早出品的一款相机

    在文件名编制上有些缺陷,每次照相得到的相片编号都是按天编排

    即每天一个文件夹,只是在每个文件夹中按001,002,003这样排下去


    但是问题在于在不同文件夹中,他们都是相同的文件名,全是001,001,001,001,如果就这样分别放到不同文件夹下也可以

    但是由于相片数量巨大一共有六千多张, 被分别放到了将近三百个文件夹中,查看起来异常繁琐。。。

    而且无法把这些照片统一放到一个文件夹下,因为他们有大量都是相同文件名的,无法放到同一文件夹下

    所以需要将他们所有照片进行重新命名,并为他们生成一个绝对唯一的文件名

    即使把这六千张照片全放到一个文件夹下,也不会重名而无法替换

    并且还要保持他们原有的特性,如001,002,003这样的顺序,所有有了这个bat

     

    原有目录结构:异常繁杂,需要重新整理


    使用方法:

    把要处理的文件夹拖到cmd下

     

    开始执行文件夹重命名操作:


    重命名预览:输入y以外的任何字符,都将退回初始状态(不区分大小写)

     

    程序参数设置:

    1,可设置文件过滤器,即源文件的过滤

    set filter="*.*"

    如只需要将JPG和AVI文件进行替换,则可写为:(中间有空格,末尾不要加空格)

    set filter="*.jpg" "*.avi"

    2,源文件名替换,src为要替换的字符串,dst为要替换为的字符串,dst为空则删除src字符串
    set replacesrc=DSC0
    set replacedst=

    当前设置就是将源文件名中的DSC0删去,如果想要把源文件名中所有“0”替换成“-”则可写为:

    set replacesrc=0
    set replacedst=-


    3,是否开启执行预览?(开启:N/关闭:Y)
    set isisdo=N
    即在执行真正更名操作前是否先查看预览,如果开启预览,则会在用户确认后再真正执行操作;反之不开启预览则直接进行更名操作

    如果文件数量非常多,预览时间将比较长,建议关闭预览(默认开启预览)


    新学到的知识:

    1,判断用户输入的路径是否为空的方法:

    可以使用

    set filepath=nul&set /p filepath=
    if "%filepath:"=%"=="nul" cls&echo 不能为空!&goto start

    先赋值一个默认值,再等待用户输入,如果直接回车则不执行赋值语句,其结果还是为之前赋的初值

    若要使用"双引号发判断,还需要先把变量中所有"双引号去掉,再统一加上,

    这样不管原字符串是否有双引号,最终都会加上双引号,并且只有一对双引号

    如果不过滤掉双引号,那么一旦用户输入一个双引号,程序就会直接退出,因为出现了错误

    %filepath%的值为“"”这个双引号,那么if语句就成了

    if """=="nul",这个语句会使前两个双引号进行配对,而最后一个双引号就成了错误字符,就直接导致程序退出
    所以双引号要成对出现

     

    2,使用call实现变量嵌套(具体讨论

    经过反复实验最终解决方法是:call set file=!datatime!-%%filesrc:!datatime!-=%%

     

    实现了变量嵌套替换。

    (先将原始文件名中的datatime删除,再在前面加上datatime,而不是一味的累加,实现只有一个datatime)

    但是从理论上来讲,filesrc在for中也发生变化,是不能使用%来标示变量的,但是使用call配合%%却没有任何错误

    百思不得其解,只能先了解这么用好了 

    批处理代码,保存至bat文件运行即可:

    @echo off
    title 自动按日期重命名文件名  by:小小沧海2012-1-29
    setlocal EnableDelayedExpansion
    ::文件过滤器,请自行按需要更改,如需过滤JPG和AVI文件,则为"*.jpg" "*.avi"
    set filter="*.*"
    ::源文件名替换,src为要替换的字符串,dst为要替换为的字符串,dst为空则删除src字符串
    set replacesrc=DSC0
    set replacedst=
    ::是否开启执行预览?(开启:N/关闭:Y)
    set isisdo=N
    ::----------------------------------------------------------------
    :start
    ::控制变量:“是否执行”,当为Y时真正执行更名操作,否则显示操作预览
    set isdo=%isisdo%
    echo 请把要处理的文件夹拖入此处
    set filepath=nul&set /p filepath=
    ::检查用户输入是否为空,同时还有过滤掉含有空格的"符号
    if "%filepath:"=%"=="nul" cls&goto start
    ::检查用户输入是否为多个空格或只有双引号
    set filepath=%filepath:"=%
    if "%filepath: =%"=="" cls&goto start
    cd /d %filepath%
    ::检查用户输入的文件夹是否是一个合法存在的文件夹
    if %ERRORLEVEL%==1 cls&echo ×输入的文件夹错误!&goto start
    :do
    echo 正在准备开始处理,请稍后...
    ::取得目标目录下所有符合条件的文件的完全路径名
    for /f "delims=" %%n in ('dir /s /b /a:-d %filter%') do (
      ::循环遍历取得当前文件的信息,按行分割并过滤掉以空格开头的行
      for /f "eol=  delims=" %%s in ('dir /-c "%%n"') do (
        ::再把过滤后的一行字符串按空格进行分割,取得日期,时间和原文件名
        for /f "tokens=1-2 delims= " %%i in ("%%s") do (
          ::构造前缀字符串
          set data=%%i
          set time=%%j
          set datatime=!data:-=!_!time::=!
          ::构造原文件名字符串,同时替换相应字符
          set filesrc=%%~nxn
          set filesrc=!filesrc:%replacesrc%=%replacedst%!
          ::构造最终文件名,并使用call将原有的前缀字符串替换掉
          call set file=!datatime!-%%filesrc:!datatime!-=%%
          ::构造结果为:日期_时间-原替换后文件名      
          if /i !isdo!==y (
            echo 执行更名:"%%~nxn"→"!file!"
            ::真正执行重命名的语句
            ren "%%n" "!file!"
          ) else (
            echo 预览更名:"%%~nxn"→"!file!"
          )
        )
      )
    )
    ::如果“是否执行”不为Y则询问是否真正执行操作
    if /i %isdo% NEQ y (
      echo -----------------------------
      echo.&echo 以上为执行预览,是否执行[是:Y/否:N]
      set isdo=n&set /p isdo=
      if /i !isdo!==y (goto do) else (cls&goto start)
    )
    
    echo -----------------------------
    echo.&echo 处理完成!
    pause>nul
    cls&goto start
    View Code

    ——原文发表于2012-1-29 01:32

  • 相关阅读:
    获取当前季的js
    C#获取文件大小
    SQL Server 2005 Express Edition 傻瓜式安装
    SET XACT_ABORT ON
    Resignation letter
    Exchange Web Services Managed API 1.0 入门
    Please let us know in case of any issues
    33条C#、.Net经典面试题目及答案
    c# 修饰词public, protected, private,internal,protected的区别
    EXEC DTS
  • 原文地址:https://www.cnblogs.com/xxcanghai/p/4583912.html
Copyright © 2011-2022 走看看