标题: [文件操作] 求助 AI给的重命名文件的BAT代码哪有问题? [打印本页]
作者: huai785 时间: 2024-1-5 23:26 标题: 求助 AI给的重命名文件的BAT代码哪有问题?
给AI讲的批处理要求 和处理过程 如下:Windows系统下, 对路径D:\ccshs\hsh下的所有文件和文件夹及子文件夹下的文件名进行操作,1、凡是文件名带有字符串“fxh.com”的其文件名中“fxh.com”删除掉,保留文件及文件夹其他字符不变;2、对路径D:\ccshs\hsh下的子文件夹下的文件大小进行判断,如果文件大小 小于50MB,不进行任何操作,如果大于50MB,记整数型数值i=1;继续对下一个文件大小进行判断,如果文件大小还是小于50MB不进行任何操作,如果大于50MB,i增加1 i=i+1;直至该子文件夹下文件全部判断完毕为止;3、如果该子文件下文件大小大于50MB的数值不等于1,不对该子文件下文件及文件夹进行任何操作;如果该子文件下文件大小大于50MB的数值等于1,判断那个文件大小大于50MB的文件文件名称是否以英文字母开头,如果是,不进行任何操作;如果文件名不是以英文字母开头而是以中文汉字字符开头的,判断改文件名中序列号字符串,所谓序列号字符串是指文件名中第一个英文字母开头向右到下一个汉字字符终止的由英文字符和连接符"-"和阿拉伯数字组成字符串,并把序列号字符串剪切粘贴到该文件名开头处,然后把该文件所在的文件夹名称改为与该文件名称一样的字符,文件夹名称中不要带文件的扩展名,继续对下一个子文件夹进行操作。AI给的代码:- @echo off
-
- setlocal enabledelayedexpansion
-
- set "startFolder=D:\ccshs\hsh"
-
- set "count=0"
-
- set "i=0"
-
- rem 遍历文件夹中的所有文件和子文件夹
-
- for /R "%startFolder%" %%F in (*) do (
-
- rem 判断文件名是否包含字符串 "fxh.com"
-
- if "%%F"=="*fxh.com*" (
-
- rem 删除文件名中的 "fxh.com" 字符串
-
- ren "%%F" "!F:fxh.com=!"
-
- )
-
- rem 判断文件大小是否大于50MB
-
- if %%~zF GTR 524288000 (
-
- set /a "count+=1, i+=1"
-
- rem 检查i的值是否为1
-
- if !i! lss 1 (
-
- goto continue
-
- )
-
- rem 检查文件名的开头是否为英文字母
-
- for /f "tokens=1 delims=*" %%A in ("%%~nxF") do (
-
- set "filename=%%A"
-
- set "extension=%%B"
-
- set "firstChar=1"
-
- for /L %%i in (2,1,99) do (
-
- set "char=!filename:~%%i,1!"
-
- if not "!char!" lss "A" set "firstChar=0"
-
- if not "!char!" gtr "z" set "firstChar=0"
-
- )
-
- if !firstChar! equ 0 goto continue
-
- )
-
- rem 获取序列号字符串并重新命名文件和文件夹
-
- for /f "tokens=1 delims=-" %%A in ("%%~nxF") do (
-
- set "sequence=%%A"
-
- ren "%%F" "!sequence!-%%B"
-
- ren "%%~pF" "!sequence!-%%~pFB"
-
- )
-
- )
-
- )
-
- :continue
-
- echo 大于50MB的文件数量: %count%
-
- echo 变量 i 的值: %i%
-
- endlocal REM 注意:结束本地环境变量作用域的设定,以避免影响到外部环境。
复制代码
作者: Batcher 时间: 2024-1-6 10:21
回复 1# huai785
请给一个真实的例子说明一下你的需求吧,比如操作之前是怎样的,操作之后变成啥样?
如果需要上传文件,请用使用网盘。
如果需要上传截图,可以找个图床,例如:
http://bbs.bathome.net/thread-60985-1-1.html
作者: 77七 时间: 2024-1-6 14:49
ai很多地方都是完全错误的,比如rem 判断文件名是否包含字符串 "fxh.com"
if "%%F"=="*fxh.com*" (
rem 删除文件名中的 "fxh.com" 字符串
ren "%%F" "!F:fxh.com=!"
试试这样能行吗
- @echo off
- rem 批处理保存为ansi编码格式
- cd /d "D:\ccshs\hsh" || exit
- setlocal
- for /f "delims=" %%i in ('dir /b /s ^|sort /r') do (
- set n=%%~nxi
- set f=%%i
- setlocal enabledelayedexpansion
- ren "!f!" "!n:fxh.com=!"
- endlocal
- )
- endlocal
-
- set /a k=50*1024*1024,m=0
- for /f "delims=" %%d in ('dir /b /ad') do (
- setlocal
- for %%a in ("%%d\*") do (
- if %%~za geq %k% (
- set /a m+=1
- set f=%%d
- set n=%%~nxa
- )
- )
- call :1
- endlocal
- )
- pause & exit
-
- :1
- if "%m%" neq "1" (
- exit /b
- )
- set _n=%n:~0,1%
- if %_n% leq Z (
- exit /b
- )
- setlocal enabledelayedexpansion
- for /l %%l in (0,1,260) do (
- set str=!n:~%%l,1!
- if !str! gtr Z (
- if not defined e (
- set /a q+=1
- ) else (
- set /a t=e+q
- goto :2
- )
- ) else (
- set /a e+=1
- )
- )
- :2
- for %%x in (q e t) do (
- if not defined %%x (
- exit /b
- )
- )
- ren "%f%\%n%" "!n:~%q%,%e%!!n:~0,%q%!!n:~%t%,260!"
- for /f "delims=" %%x in ("!n:~%q%,%e%!!n:~0,%q%!!n:~%t%,260!") do (
- ren "%f%" "%%~nx"
- )
- endlocal
- exit /b
复制代码
作者: huai785 时间: 2024-1-6 21:25
回复 2# Batcher
我的需求是这样的 主要是批处理修改文件和文件夹名称
在D:\gxhhd\ 文件夹下面 存放了很多 子文件夹 每个子文件夹里存有一个 主文件(是视频文件 如果从文件大小判断 这个文件一般大于50MB,也可以从其他方面判断比如扩展名一般为.AVI .mp4.mkv.rmvb等)和若干个小文件(小文件一般是配文.txt 配图.jpg,字幕等一般不超过50MB),小文件的名称不需要动不需要处理,每个子文件夹和其内部的主文件名称是一致的(文件夹不带主文件扩展名),现在文件夹和下面主文件的名称命名格式是这样的“ [hsuuu.com]一串中文汉字描述Ttitle-202301再跟一串汉字描述.扩展名”(说明:对于每个文件。文件夹 [hsuuu.com]是统一的没变化的,“一串中文汉字描述”是不一样的字数内容都不一样,“Ttitle-202301”是我需要的特征符 字串长度字母不一样,但是只有字母和连字符、数字这三种组成,有的中间不带连字符只有字母和数字两种组成,后面再跟的一串汉字也是每个文件不一样的),我需要的操作是:1、把D:\gxhhd\ 文件夹下面 所有的 子文件夹及里面的主文件文件名开头所带的“[hsuuu.com]”这一串全部清除;2、将主文件 文件名中的特征符(序列码 汉字中间 只有字母连字符数字 或者只有字母数字组成的)剪切粘贴 提到主文件名开头位置,其他原来的汉字描述仍保留在特征符后面,这样 后期我可以按照特征符排序进行其他操作整理。3、吧主文件所在的文件夹名称改为和修改后的主文件名称一致(但不要主文件的扩展名)。需要说明的特殊情况:1、有的子文件夹中有两个或以上主文件(两个视频文件或大文件)不需要任何操作 2、有的子文件夹和里面的主文件是以字母开头的不是以汉字字符开头的说明 该文件已处理过了 不需要任何操作,如遇以上两种特殊情况 不需要操作他跳过就可以了,毕竟特殊情况的是少数 后面我手动操作即可。
作者: huai785 时间: 2024-1-7 21:56
回复 3# 77七
运行成功
作者: aloha20200628 时间: 2024-1-8 12:44
批处理脚本能处理的最大整数=2,147,483,647,相当于2GB的文件尺寸,视频文件尺寸有可能超出。
作数值运算或比较时,如超限则系统报错;作字符串比较时,会因位数不足而导致失误。
作者: 77七 时间: 2024-1-8 15:50
本帖最后由 77七 于 2024-1-8 15:54 编辑
回复 6# aloha20200628
谢谢大佬指点!
修改 15-26行为:
- for /f "delims=" %%d in ('dir /b /ad') do (
- setlocal enabledelayedexpansion
- for %%a in ("%%d\*") do (
- set z1=00000000000000000000000%%~za
- set z2=00000000000000000000000%k%
- set z1=!z1:~-20!
- set z2=!z2:~-20!
- if "!z1!" geq "!z2!" (
- set /a m+=1
- set f=%%d
- set n=%%~nxa
- )
- )
- call :1
- endlocal
- )
复制代码
作者: czjt1234 时间: 2024-1-8 18:08
厉害了
我不但代码没看明白,连需求都没看明白
作者: huai785 时间: 2024-1-14 10:03
回复 8# czjt1234
测试了 上面77七给代码 可行
我的需求你没看懂吗?
以路径D:\ccshs\hsh 为例 现在hsh文件夹里 有很多子文件 他们的文件名称 现在的文件名称 结构状况是 例如“fxh.com张三二零年吃饭ERT-117红色”、“fxh.com李四生日BRR02没意思”、“fxh.com西湖红石mn-4401没意思”、“fxh.comEUn-471不知该处理”.....每个文件下有个主文件 名称所在文件名称相同 如“fxh.com张三二零年吃饭ERT-117红色.mp4”、“fxh.com李四生日BRR02没意思.avi”、“fxh.com西湖红石mn-4401没意思.mkv”、“fxh.comEUn-471不知该处理.mkv”.....和若干个小文件 TXt文字简介、JPG配图、Sub字幕等,有的只有主文件 没有小文件,个别的里面有两个或以上视频大文件,对于那些小文件不进行任何操作,个别情况有两个以上大文件的也不用操作(数量少我可以手动修改):现在想要实现的操作是:1、 把里面文件夹和主文件名称中带有前缀“fxh.com”这给全部删除掉;2、把主文件、文件夹名称里的 特征码(编码号)提到最前面来,其他文字还保留在编码后面 修改后效果是这样的“ERT-117张三二零年吃饭红色”、“BRR02李四生日没意思”、“mn-4401西湖红石没意思”、“EUn-471不知该处理”.....“ERT-117张三二零年吃饭红色.mp4”、“BRR02李四生日没意思.avi”、“mn-4401西湖红石没意思.mkv”、“EUn-471不知该处理.mkv”.....(这个编码 是指文件名称中 字母 连字符 数字组成的那部分 有的只有字母和数字 不带连字符),不知道你明白没有?你有更好的批处理代码吗?
作者: huai785 时间: 2024-1-14 10:03
回复 7# 77七
非常感谢,问题已解决
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |