把当前及子目录所有文件复制到一个文件夹中并排好序的bat脚本

这个脚本会把当前目录及子目录下的所有文件都拷贝到当前目录的“wholeFolder”名称的文件夹中,并且按着一定的逻辑重命名进行排序了的。

目前只能按自然顺序排序,有的东西会分段“上、中、下”,这脚本是不能准确排序的。因为它在windows里就没有排好顺序。

脚本代码我放文末了,中间吹下牛逼。

日常生活中,我们会下载一些漫画来看,但是漫画会分很多章节,甚至每个章节里面还会分上下,这样我们就会经常出现,看完一章,返回根目录一看,妈耶我看到哪一章了。

而且我看漫画会经常顺便做一些愉快的事情的,这种返回根目录打开下一个目录的操作就算我记住已经看到哪一章其实还是会影响我做愉快的事情的。

我就想,能不能整个程序把这些文件全提取到一个文件夹里面,这样我就能直接幻灯片播放专心地做愉快的事情了。

开始语言的挑选。java?我发个jar包给没装jdk的根本运行不了;c#,我发个没认证的exe程序给你先不说你怕不怕,杀毒软件都不同意;我就决定选用我一点都不会的bat脚本,值得选它的理由蛮多的,第一:谁质疑bat脚本有毒会被人笑话的;第二:没有运行环境的要求,你是台windows设备就能用;第三:我要装逼,证明自己学习能力不错。这个脚本是我花了两天半从零知识写出来的,一路上遇到了很多卡住很久的问题,不过最后都克服了。

实现思路:

单纯把那些文件都复制到一个文件夹中肯定是不行的,因为肯定有文件名重复的问题,就算没文件名重复问题,还有排序的问题。

我是按照目录结构来实现排序的。一开始想的是1-1,1-1-1,1-2,2-1,2-1这样作为文件名的前缀去拼接的,稍微试了下就发现不可靠,比如下图,01所处的层级排序优先级肯定比01-01高的,但是01-11最终排序在了01-01-1的后面。

 那么我就需要填满一下前缀,使所有前缀长度一致,就不会出现上面的问题了。要使所有前缀长度一致,我就需要1、知道单个目录下目录数量最大的数量,来确定每层宽度;2、 知道当前目录中到最深的子目录的距离,来确定要填充多少层。

这两个东西脚本会在一开始就去确认,比如我下图,目录数量最大的为7个,只有个位数,本来可以把宽度定义为1,我为了方便运算就把每层宽度值确定为2位数初始值是10。最深有5层,那么就按5层宽度去填充所有前缀。

 最终成品效果如下图所示:

题外话:

这脚本写到一半,我突然想起来,万一有的看图软件已经实现了我的需求(自动查看下一个文件夹),我写的这东西不就显得很智障?我一百度,还真有……比如2345看图王什么的,有自动查看下一个文件夹图片的功能,不过我及时发现不够智能的地方,如果像我上面说的,章节里面还分了上下章,2345看图王的查看下一个文件夹功能会失效的,只能在这上、下文件夹之间来回切换。自我安慰一下写这个东西还是有点用的。

@echo off
setlocal enabledelayedexpansion
set newFolder=%~dp0wholeFolder
if exist !newFolder! ( echo 目录"%newFolder%"已存在) else ( md "%newFolder%")
set "deepestCount=0"
set "maxCount=0"
call :findMaxCountAndDeepestCount "%cd%",1
echo 文件夹最多层数是!deepestCount!个。
echo 单个文件夹里文件夹数量最大的为!maxCount!个。
set groupValue=1
call :generalGroupValue !maxCount!
echo 每层间隔初始值groupValue:!groupValue!
set /a n=0
for /d %%i in (*) do (
set /a n+=1
set childPath=%%~pi
set fileName=%%~nxi
set fullName=%%~fi
if "!fullName!" neq "%newFolder%" (
call :findandCopy !n!,"","!fullName!",1
) else (echo 目标文件夹,不操作)
)
echo 复制完毕,请前往当前目录的wholeFolder文件夹查看
pause
goto :eof
rem 找到文件并复制到新文件夹里面去  <当前层级计数> <文件名前缀第一部分> <文件夹全路径> <层级>
:findandCopy
(
   set myCount=%1
   set myAfterFix="%2"
   set myFullFilePath=%3
   set myLevel=%4
   call :generalPrePre !myAfterFix!,!myCount!
   set myPrePrePath=!prePrePath!
   for %%j in (!myFullFilePath!\*.*) do (
     set copyFile="%%~fj"
     set myrAfterFix="%%~nxj"
     call :generalPreAfter !myPrePrePath!,!myLevel!
     set myPreAfterPath=!preAfterPath!
     copy /y "%%~fj" "!newFolder!\!preAfterPath!-!myrAfterFix!"
   ) 
   setlocal
   set /a k=0
   for /d %%k in (!myFullFilePath!\*) do (
      set /a k+=1
      set /a tempLevel=%4+1
      set fullName=%%~fk
      call :generalPrePre "%2",%1
      set tempForPrePrePath=!prePrePath!
      call :findandCopy !k!,!tempForPrePrePath!,"!fullName!",!tempLevel!
   )
   endlocal
   exit /b
)

rem 生成文件名前缀的第一步,用于排序 <上层前缀> <当前序号>
:generalPrePre
set prePrePath=%1
set nowPreCount=%2
set /a tempPre=!groupValue!+!nowPreCount!
set prePrePath=!prePrePath!!tempPre!
exit /b

rem 生成文件名前缀的第二步,用于补齐 <前缀前半部分> <当前层数>
:generalPreAfter
set preAfterPath=%1
set nowPreLevel=%2
set /a tempPreAfter=!deepestCount!-!nowPreLevel!
:generalPreAfterBegin
set preAfterPath=!preAfterPath!!groupValue!
if !tempPreAfter! neq 1 (
set /a tempPreAfter-=1
goto generalPreAfterBegin
)
exit /b

rem 找到当前目录及其子目录下,单个文件夹里文件夹数量最大值和最深层数 <遍历目录> <当前遍历所处层数>
:findMaxCountAndDeepestCount
(
   set myFullFilePath=%1
   set nowDeep=%2
   if !deepestCount! lss !nowDeep! (set "deepestCount=!nowDeep!")
   set /a v=0
   for /f "delims=" %%a in ('dir !myFullFilePath! /b /a:d') do set /a v+=1
   if !maxCount! lss !v! (set "maxCount=!v!")
   for /d %%k in (!myFullFilePath!\*) do (
      set /a tempDeep=%2+1
      set fullName=%%~fk
      call :findMaxCountAndDeepestCount "!fullName!",!tempDeep!
   )
   exit /b
)

rem 生成每层间隔初始值
:generalGroupValue
(
    :generalGroupValueBegin
    set /a groupValue=!groupValue!*10
    set /a tempCha=!groupValue!-!maxCount!
    if !tempCha! lss 0 (goto generalGroupValueBegin)
   exit /b
)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值