标题: 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 编辑
- @if(0)==(0) echo off
- dir /b /s *:*.pdf | cscript //nologo //e:jscript "%~f0"
- rem for /d %%i in (*) do rd "%%i" 2>nul
- pause & goto :EOF
- @end
-
- var fso = new ActiveXObject('Scripting.FileSystemObject');
- var str = WSH.StdIn.ReadAll();
- var reg = /.*\\([0-9]{6})([^\\]*):([0-9]{4})[^\r\n\\]*/g;
- var map = [], arr = [];
-
- while(arr = reg.exec(str)){
- if(!map[arr[1]]) map[arr[1]] = [];
- map[arr[1]].push([arr[0], arr[2], arr[3]]);
- }
-
- for(var key in map){
- map[key].sort(function(a,b){ return b[2]-a[2] }); //以4位数年份排序
- var fd = key + map[key][0][1];
- if(!fso.FolderExists(fd)) fso.CreateFolder(fd); //创建文件夹
- for(var i=0; i<map[key].length; i++) fso.GetFile(map[key][i][0]).Move(fd + '\\'); //移动文件
- }
复制代码
作者: ShowCode 时间: 2017-4-20 15:37
深万科A
G万科
万科A
万科A
可能你很容易判断出这四个都是万科
但是要让电脑明白这一点是比较复杂的
作者: taofan712 时间: 2017-4-20 16:48
- @echo off
- setlocal enabledelayedexpansion
- for /f "delims=" %%a in ('dir /a-d /b *.pdf') do (
- set "fn=%%~a"
- set code=!fn:~0,6!
- if not exist !code! md !code!
- move /y !code!*.pdf !code! >nul 2>nul
- )
- for /f "delims=" %%a in ('dir /ad /b') do call :cn %%a
- echo;处理完毕&pause>nul&exit
-
- :cn
- setlocal
- for /f "tokens=1,2 delims=::年" %%a in ('dir %1 /a-d /b') do set .year%%b=%%a
- for /f "tokens=2 delims==" %%a in ('set .year^|sort /r') do (
- ren %1 %%a
- endlocal
- goto :eof
- )
复制代码
应该是没问题的。
作者: 逐月飞鸿 时间: 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
- @echo off & setlocal enabledelayedexpansion
- if "%~1" == "arg" (
- for /r %%i in (*:*年*.pdf) do (
- for /f "tokens=1,2 delims=:年" %%j in ("%%~ni") do (
- set "s=%%j"
- echo;!s:~0,6!/%%k/!s:~6!/%%i
- )
- )
- ) else (
- set "s="
- for /f "tokens=1,3* delims=/" %%i in ('"%~f0" arg ^| sort /r ') do (
- if not "%%i" == "!s!" set "fd=%%i%%j"
- set "s=%%i"
- md "!fd!"
- move "%%k" "!fd!\"
- ) 2>nul
- for /d %%i in (*) do rd "%%i" 2>nul
- pause
- )
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |