Board logo

标题: 50(元)求修改bat代码,实现如下功能! [打印本页]

作者: 逐月飞鸿    时间: 2017-4-20 08:18     标题: 50(元)求修改bat代码,实现如下功能!

求一个自动创建文件夹并智能命名文件夹,并归档的bat
有如下很多文件:
000002深万科A:2001年报告-1.PDF
000002G万科:2005年报告-1.PDF
000002万科A:2002年报告-1.PDF
000002万科A:2015年报告.PDF
……
000004ST国农:2006年报告-1.PDF
000004北大高科:2001年报告-1.PDF
000004北大高科:2004年报告-1.PDF
000004国农科技:2010年报告(更新后)-1.PDF
000004国农:2014年报告(更新后).PDF
……

1.以":"前面的“代码+股票名字”建立文件夹,若同一个代码后有多个名字,譬如:000002G万科,000002万科A,则以“:”后年份数据最大的为准,命名该文件夹。
如上面的:分别建立 文件夹“000002万科A”、“000004国农”。
(因为000002万科A 2015年是最新名称,000004国农是最新名称,对应2014年)
2.把前面6位数字相同的文件归入到文件名前6位相同的文件夹中。
【备注,如果有文件夹了,则不需创建,直接移动到对应的文件中】
3.更智能的能否实现:若有新的文件放入,运行后,也把这些文件自动按代码移入到上面的文件夹或子文件夹中。并据文件里面的最大年份前的名称自动更新文件夹名。 譬如:000004国农高科:2018年报告.PDF 运行后,放入到000004国农“后,并修改文件夹名为000004国农高科“。


原来百度高手“
乱世t逃犯”
给出了如下代码:
@echo off
setlocal enabledelayedexpansion
for /r %%a in (*.pdf) do (
    for /f "tokens=1* delims=年" %%b in ("%%~nxa") do (
         rem echo;%%b
         set leftn=%%b
         set leftn=!leftn: =!
         if not "!leftn:~-5,1!" ==":" set "leftn=!leftn:~,-4!:!leftn:~-4!"
         md !leftn:~,-5! 2>nul
         ren "%%~a" "!leftn!年%%~c"
    )
)
for /f "delims=" %%i in ('dir /ad /b') do (
     for /f "delims=" %%j in ('dir /a-d /b "%%~i:*.PDF"') do (
           move "%%~j" "%%~i"
     )
)
echo;处理完毕&pause>nul&exit /b

请高手修改一下,谢谢,讲述不清楚的可以qq66188026.
作者: 逐月飞鸿    时间: 2017-4-20 08:23

[img],乱世t逃犯的代码已经实现自动建立文件夹并归档,美中不足的是
1.同一股票代码因为不同年份名称不同,建立了不同文件,没有按最新年份命名文件夹并归并
2.如果后来再这些文件夹的根目录下,进入新的年报,运行后按代码归入到原来的文件中。
作者: 逐月飞鸿    时间: 2017-4-20 08:25

[attach]10576[/attach][attach]10576[/attach]
作者: taofan712    时间: 2017-4-20 08:46

你所谓的“高手”,在这里愧疚难安
作者: WHY    时间: 2017-4-20 13:14

本帖最后由 WHY 于 2017-4-20 14:44 编辑
  1. @if(0)==(0) echo off
  2. dir /b /s *:*.pdf | cscript //nologo //e:jscript "%~f0"
  3. rem for /d %%i in (*) do rd "%%i" 2>nul
  4. pause & goto :EOF
  5. @end
  6. var fso = new ActiveXObject('Scripting.FileSystemObject');
  7. var str = WSH.StdIn.ReadAll();
  8. var reg = /.*\\([0-9]{6})([^\\]*):([0-9]{4})[^\r\n\\]*/g;
  9. var map = [], arr = [];
  10. while(arr = reg.exec(str)){
  11.     if(!map[arr[1]]) map[arr[1]] = [];
  12.     map[arr[1]].push([arr[0], arr[2], arr[3]]);
  13. }
  14. for(var key in map){
  15.     map[key].sort(function(a,b){ return b[2]-a[2] }); //以4位数年份排序
  16.     var fd = key + map[key][0][1];
  17.     if(!fso.FolderExists(fd)) fso.CreateFolder(fd);   //创建文件夹
  18.     for(var i=0; i<map[key].length; i++) fso.GetFile(map[key][i][0]).Move(fd + '\\'); //移动文件
  19. }
复制代码

作者: ShowCode    时间: 2017-4-20 15:37

深万科A
G万科
万科A
万科A

可能你很容易判断出这四个都是万科
但是要让电脑明白这一点是比较复杂的
作者: taofan712    时间: 2017-4-20 16:48

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%a in ('dir /a-d /b *.pdf') do (
  4. set "fn=%%~a"
  5. set code=!fn:~0,6!
  6. if not exist !code! md !code!
  7. move /y !code!*.pdf !code! >nul 2>nul
  8. )
  9. for /f "delims=" %%a in ('dir /ad /b') do call :cn %%a
  10. echo;处理完毕&pause>nul&exit
  11. :cn
  12. setlocal
  13. for /f "tokens=1,2 delims=::年" %%a in ('dir %1 /a-d /b') do set .year%%b=%%a
  14. for /f "tokens=2 delims==" %%a in ('set .year^|sort /r') do (
  15. ren %1 %%a
  16. endlocal
  17. goto :eof
  18. )
复制代码
应该是没问题的。
作者: 逐月飞鸿    时间: 2017-4-20 17:24

谢谢,因为中午qq2040486120大侠给出代码
如下:
@echo off

REM 开启变量延迟
setlocal enabledelayedexpansion

REM 搜索所有PDF文件
for /f "tokens=1* delims=年" %%a in ('dir /a-d /b *.PDF') do (
        set "str=%%~na"
        set "SN=!str:~0,6!"
        set "EN=!str:~-4!"

        if "!EN:~0,2!"=="20" (

                REM 获取股票代码
                if not defined ###_!SN!_ (
                        set "###_!SN!_=!EN!_!str:~0,-4!"

                ) else (
                        for %%I in (!SN!) do (set "tmp=!###_%%I_!")
                        set "tmp=!tmp:~0,4!"

                        if !EN! gtr !tmp! (
                                REM 获取最新年份股票名称
                                set "###_!SN!_=!EN!_!str:~0,-4!"
                        )
                )
        ) else (
                if not defined ###_!SN!_ (
                        for /f "tokens=1 delims=:" %%z in ("%%~na") do (
                                set "###_!SN!_=2000_%%z"
                        )
                )
        )
)

REM 根据股票代码创建文件夹
for /f "tokens=2,3* delims=_" %%a in ('set ###_') do (
        set "str=%%c"       

        REM 去掉文件名中的冒号
        if "!str:~-1!"==":" (
                set "str=!str:~0,-1!"
        ) else if "!str:~-1!"==":" (
                set "str=!str:~0,-1!"
        )

        REM 创建文件夹
        md "!str!"

        REM 按股票代码搜索PDF
        for /f "delims=" %%A in ('dir /a-d /b /s "%%a*.PDF"') do (

                REM 相同股票代码的PDF进行归类
                echo 正在移动... "%%~nA"
                move "%%A" "!str!"
        )
)

REM 清理空文件夹
for /f "delims=" %%a in ('dir /ad /b') do (
        if not exist "%%a\*.PDF" (
                rd "%%a" /q
        )
)
pause

谢谢taofan712 及WHY
作者: 逐月飞鸿    时间: 2017-4-20 17:28

本帖最后由 逐月飞鸿 于 2017-4-20 17:31 编辑

本帖已经完美解决,特别感谢,费用已结qq2040486120大侠。请勿再研究。
特别不好意思,因为qq联系测试,没有顾及本帖结帖。抱歉!
作者: 老刘1号    时间: 2017-4-20 20:55

回复 4# taofan712


    嘿嘿嘿,没想到你在百度贴吧还有号
作者: WHY    时间: 2017-4-21 12:00

回复 7# taofan712


    文件名中应该不能包含半角冒号的,即便是 NTFS 流文件,单凭 dir + for 也不可能显示出来的吧
作者: WHY    时间: 2017-4-21 12:04

  1. @echo off & setlocal enabledelayedexpansion
  2. if "%~1" == "arg" (
  3.     for /r %%i in (*:*年*.pdf) do (
  4.         for /f "tokens=1,2 delims=:年" %%j in ("%%~ni") do (
  5.             set "s=%%j"
  6.             echo;!s:~0,6!/%%k/!s:~6!/%%i
  7.         )
  8.     )
  9. ) else (
  10.     set "s="
  11.     for /f "tokens=1,3* delims=/" %%i in ('"%~f0" arg ^| sort /r ') do (
  12.         if not "%%i" == "!s!" set "fd=%%i%%j"
  13.         set "s=%%i"
  14.         md "!fd!"
  15.         move "%%k" "!fd!\"
  16.     ) 2>nul
  17.     for /d %%i in (*) do rd "%%i" 2>nul
  18.     pause
  19. )
复制代码





欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2