标题: [文件操作] 求助批处理识别文件名创建文件夹并将文件移入 [打印本页]
作者: xukan 时间: 3 天前 19:19 标题: 求助批处理识别文件名创建文件夹并将文件移入
文件格式为:A_B_C_32P0001.JPG D_E_F_54Ps0001.JPG
A_B_C_32P0002.JPG D_E_F_54Ps0002.JPG
. .
. .
. .
A_B_C_32P0032.JPG D_E_F_54Ps0054.JPG
32P为图片数量,数量不固定。希望识别到数字+P截止,创建名称为A_B_C_32P和D_E_F_54P的文件夹并移入文件。
ABC DEF仅作举例,不是实际文件名。
作者: aloha20200628 时间: 3 天前 20:20
本帖最后由 aloha20200628 于 2024-12-26 20:56 编辑
回复 1# xukan
以下代码存为 test.bat 运行,与源文件 *.jpg 同目录...
- @echo off &setlocal enabledelayedexpansion
- for /f "delims=" %%F in ('dir /b/a-d *_*p*.jpg') do (
- set "dd=%%~nF" &set "d=!dd!" &set "n=" &(call :cutEd)
- for %%k in (!k!) do (set "d=!dd:~,%%k!")
- if not exist "!d!\" md "!d!"
- move /y "%%F" "!d!\")
- pause&exit/b
- :cutEd
- if "!d!"=="" (exit/b) else set "c=!d:~-1!"
- if "!c!"=="_" (exit/b) else if /i "!c!"=="p" set "k=!n!"
- set "d=!d:~,-1!" &set/a "n-=1" &goto :cutEd
复制代码
作者: xukan 时间: 前天 19:36
回复 2# aloha20200628
运行后部分结果如下
_24p _52p _63p
_24pp _52pap _63p6p
能否再优化一下,解决可能有多个P的情况。
作者: aloha20200628 时间: 前天 20:57
回复 3# xukan
2楼代码已更新,再试试吧...
作者: qixiaobin0715 时间: 昨天 10:43
换个思路,不从数字+P来考虑问题,如果文件名满足下列条件:
1.文件名以”_“来分隔,均被分隔为4部分;
2.被分隔的第4部分,其前面字符均为数字+P的形式;
3.第2条所说的数字不以0开头。
如果满足上述条件,可以试试下面代码:- @echo off
- setlocal enabledelayedexpansion
- for /f "tokens=1-3* delims=_" %%a in ('dir /b /a-d *.jpg') do (
- set "n=%%d"
- set /a n=n
- md "%%a_%%b_%%c_!n!P" 2>nul
- move "%%a_%%b_%%c_%%d" "%%a_%%b_%%c_!n!P\"
- )
- pause
复制代码
作者: aloha20200628 时间: 昨天 12:01
2楼代码采用 call+goto 方法,从文件名末尾回扫直到遭遇 ‘_’ 分隔符即可析取目标字符串,无论文件名头部有多少个被分割字段... call+goto方法能实现可变循环条件,确实是批处编程的一枚利器,便于解决很多字符串中给定位置或字段的精确处理问题(即逐字遍历检查+及时处理退出),只是处理大数据时会有降速,但这是先能后快的顺序或取舍的问题...
作者: qixiaobin0715 时间: 昨天 13:17
本帖最后由 qixiaobin0715 于 2024-12-27 14:34 编辑
回复 6# aloha20200628
一句话惊醒梦中人。如果无论文件名中有多少个分隔符(_),表达同一类图片文件的个数(正常不会出现054P这种情况)的位置,都是紧接在最后一个”_“分隔后面,这样做可能比5楼代码更通用些,代码未经测试,可能存在问题,思路应当没有大的问题:- @echo off
- for /f "delims=" %%i in ('dir /b /a-d *.jpg') do (
- set str="%%i"
- setlocal enabledelayedexpansion
- set "str=!str:_=" "!"
- for %%j in (!str!) do (
- if defined str1 (
- if defined str2 (
- set "str2=!str2!_!str1!"
- ) else (
- set "str2=!str1!"
- )
- )
- set "str1=%%~j"
- )
- set /a "str1=str1"
- md "!str2!_!str1!P" 2>nul
- move "%%i" "!str2!_!str1!P"
- endlocal
- )
- pause
复制代码
不善于或者是不喜欢使用goto或call语句。
谢谢!!!
作者: qixiaobin0715 时间: 昨天 14:31
由于考虑不周,上面代码出了点小问题,已修改。
作者: 77七 时间: 3 小时前
- @echo off
- cd /d "%~dp0"
- for /l %%l in (0,1,9) do (
- for /f "delims=" %%i in ('2^>nul dir /b /a-d "*%%lp*.jpg"') do (
- set "n=#%%~ni"
- setlocal enabledelayedexpansion
- for /f "delims=|" %%d in ("!n:%%lp=|!") do (
- endlocal
- set folder=%%d%%lP
- setlocal enabledelayedexpansion
- md "!folder:~1!" 2>nul
- move "!n:~1!%%~xi" "!folder:~1!\"
- endlocal
- )
- )
- )
- pause
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |