Board logo

标题: [文件操作] 批处理如何批量将指定扩展名的文件的名称的前10位字符命名给另一种扩展名的文件 [打印本页]

作者: kmustwxw    时间: 2014-11-25 09:17     标题: 批处理如何批量将指定扩展名的文件的名称的前10位字符命名给另一种扩展名的文件

本帖最后由 pcl_test 于 2016-11-3 15:00 编辑

批处理如何实现文件批量命名?
文件夹里有A.B两种格式的文件,A的格式为.jpg ,B的格式为.pdf,现在要把A的文件名的前10位命名给B文件,如何写代码。 求帮助
作者: hank_fan    时间: 2014-11-25 11:42

还是不太清楚,最好举个例子说下你的需求。
作者: kmustwxw    时间: 2014-11-25 11:47

比如 :一个名为:我的图片.jpg  要把这个名字命名给一个pdf格式的文件,它们都在同一个文件夹里,
作者: DAIC    时间: 2014-11-25 12:11

说好的前10位呢?
你乱举例子,别人乱写代码,总后还是无法解决你的实际问题。

我的图片1234567.jpg
我的图片1234568.jpg
我的图片1234569.jpg

张三.pdf
李四.pdf
王五.pdf

我要根据什么规律把jpg和pdf文件名对应起来?
作者: kmustwxw    时间: 2014-11-25 12:43

不好意思,我再说下,对应起来就根据它们在文件夹里按名称的排列来对应,它们都放在一个文件夹里,按你上面列举的,把第一个图片的名字,命名给第一个pdf. 如?张三.pdf改为:我的图片1234567.pdf  李四.pdf应改为:我的图片1234568.pdf,依此下去,不知道我说的清楚不?
作者: hank_fan    时间: 2014-11-25 12:53

回复 5# kmustwxw
不太清除你的这个要求,那要是PDF多余或少于jpg文件,不就对应不上了,你这个程序主要用来干嘛?

搞技术最不爽的就是需求描述不清。。。。。。。。
作者: hank_fan    时间: 2014-11-25 12:54

你就直接把你要做的事说出来,就简单了,否则,你再喊上几个月,大家也帮补了你。
作者: kmustwxw    时间: 2014-11-25 13:20

[img][/img]
看看图片的对应关系,jpg和pdf数目一样,不会一个多一个少的,看看下面的代码,也许有帮助,但是运行的结果不对,找不到文件。
  1. @echo on&setlocal enabledelayedexpansion
  2. for /f %%a in ('dir *.jpg /b') do (for /f %%b in ('dir *.pdf /b') do set a=%%a&set a=!a:~0,-5!&ren %%b !a!.pdf
  3. )
  4. pause
复制代码

作者: DAIC    时间: 2014-11-25 13:36

回复 5# kmustwxw
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. dir /b *.jpg >file_jpg.txt
  4. dir /b *.pdf >file_pdf.txt
  5. (for /f "delims=" %%i in (file_jpg.txt) do (
  6.     set /p strPDF=
  7.     ren "!strPDF!" "%%~ni.pdf"
  8. ))<file_pdf.txt
复制代码

作者: kmustwxw    时间: 2014-11-25 14:16

太感谢你了,我运行了下,我要是想取jpg的文件名的前10位,应该怎么修改代码?还有就是:下面这段代码哪里有不对的,如何修改,谢谢。
  1. @echo on&setlocal enabledelayedexpansion
  2. for /f %%a in ('dir *.jpg /b') do (for /f %%b in ('dir *.pdf /b') do set a=%%a&set a=!a:~0,10!&ren %%b !a!.pdf
  3. )
  4. pause
复制代码

作者: CrLf    时间: 2014-11-25 14:56

回复 9# DAIC


ren "!strPDF!" "%%~ni.pdf" 改成 ren "!strPDF:~,10!" "%%~ni.pdf"
再来个我最爱的:
  1. @echo off
  2. (for %%a in (*.jpg) do (
  3.     set "name=%%~na"
  4.     setlocal enabledelayedexpansion
  5.     ren *.pdf "!name:~,10!._pdf"
  6.     endlocal
  7. )) 2>nul
  8. ren *._pdf *.pdf
复制代码

作者: kmustwxw    时间: 2014-11-25 17:08

非常感谢帮你们的帮助,很感激,很好,很张大。努力学习中
作者: kmustwxw    时间: 2014-11-26 09:58

回复 11# CrLf
ren "!strPDF!" "%%~ni.pdf" 改成 ren "!strPDF:~,10!" "%%~ni.pdf"  你说的这段代码好像有问题。你的最爱没有问题能解决问题,很好,很强大,我改了下:ren "!strPDF!" "%%~ni.pdf" 改成 ren "!strPDF!" "!strPDF:~,10!.pdf" 不知道对不对?
作者: CrLf    时间: 2014-11-26 12:31

回复 13# kmustwxw


    哦是的,混乱了
作者: yiwuyun    时间: 2014-11-26 21:17

ren *.pdf "!name:~,10!._pdf"
这一句没问题吗?我总感觉怪怪的喃,我没试过。如果是正确的,要怎么解释喃?*不是代表所有吗?而后面那个
"!name:~,10!._pdf"是代表一个文件啊。所有对一个,有点讲不通啊。难道一直以来我就理解错了,*是代表单一?
作者: CrLf    时间: 2014-11-26 21:57

回复 15# yiwuyun


    *.pdf 匹配到的第一个更名成功后,其他文件都会改名失败
作者: amwfjhh    时间: 2014-11-26 22:15

还有这么个规则……学习了。
作者: amwfjhh    时间: 2014-11-26 22:19

回复 16# CrLf

@echo off
(for %%a in (*.jpg) do (
    set "name=%%~na"
    setlocal enabledelayedexpansion
    ren *.pdf "!name:~,10!._pdf"
    endlocal
)) 2>nul
ren *._pdf *.pdf

   
再请教一下,这里的setlocal放在for里面是另有用意吗?还是跟放在外部是一样的效果?
作者: CrLf    时间: 2014-11-26 22:57

本帖最后由 CrLf 于 2014-11-26 22:59 编辑

回复 18# amwfjhh


    这样可以兼容文件名含 ! 的情况,做个对比实验就懂了:
  1. @echo off
  2. (for /f "delims=" %%a in (%~s0) do (
  3.    set str=%%a
  4.    setlocal enabledelayedexpansion
  5.    echo !str!
  6.    endlocal
  7. ))>test1.txt
  8. pause
复制代码
  1. @echo off&setlocal enabledelayedexpansion
  2. (for /f "delims=" %%a in (%~s0) do (
  3.    set str=%%a
  4.    echo !str!
  5. ))>test2.txt
  6. pause
复制代码

作者: amwfjhh    时间: 2014-11-26 23:00

看得心痒,我换win机子测试下……
作者: CrLf    时间: 2014-11-26 23:09

回复 20# amwfjhh


    这跟瘟7有啥关系
作者: amwfjhh    时间: 2014-11-26 23:17

谢谢。延时理解又多了一分。
作者: amwfjhh    时间: 2014-11-26 23:19

回复 21# CrLf


    WINDOWS机子,刚才在MAC上熟悉下操作习惯,看到贴子想测试没环境,只好心痒痒地换到WINDOWS上来测试结果了。
作者: CrLf    时间: 2014-11-26 23:20

回复 23# amwfjhh


    卧槽,壕,求包养
作者: amwfjhh    时间: 2014-11-26 23:24

我要是壕就不需要熟悉了,早就用得不想再用了,这是项目设备,第一天接触……
作者: CrLf    时间: 2014-11-26 23:28

回复 25# amwfjhh


    我tm上次摸的苹果还是红富士
作者: amwfjhh    时间: 2014-11-26 23:34

差点看成“富士康”。
作者: amwfjhh    时间: 2014-11-26 23:42

回复 19# CrLf


    除了开启局部延时,set/p好像也对!可以很好支持。
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "tokens=*" %%i in ('^<%~s0 find /c /v ""') do set /a lineCount=%%i
  4. <%~s0 >test2.txt (for /l %%a in (1 1 !lineCount!) do (
  5.    set /p str=
  6.    echo !str!
  7. ))
  8. echo 共 !lineCount! 行
  9. fc test2.txt %~s0
  10. pause
复制代码

作者: CrLf    时间: 2014-11-26 23:51

本帖最后由 CrLf 于 2014-11-26 23:52 编辑

回复 28# amwfjhh


    是的,变量延迟发生在解析语法之后、执行命令前夕,引用 %%a 的时候会发生变量延迟,而执行 set /p 取得输入之前变量延迟已经发生过了
    set /p 有个缺点是最多读取 1024 字节,超出就被截断,这个相当郁闷
作者: amwfjhh    时间: 2014-11-26 23:55

回复 29# CrLf


    一次处理这么多内容我坚决不用批处理了,会把任务分摊给其它工具去,然后把结果返回给批处理再接着整。
作者: CrLf    时间: 2014-11-27 00:11

回复 30# amwfjhh


    好吧,现在我也是这样。曾经是忠实纯批+vbs/js派,因为这组合最通用
    后来接触的东西多了渐渐觉得 shell 只是 shell,不要硬生生当脚本用,搞得很累,效果还未必好
    不过感觉单就楼主要求而言,貌似还是纯批最方便
作者: amwfjhh    时间: 2014-11-27 00:41

是,能用纯批处理来解决的,尽量用批处理来完成。如果吃力或者耗时太多的,还是交给其它工具完成吧,把这个作为兴趣与锻炼可以继续去研究纯p处理方式,解决问题还是以实用为主。
作者: hank_fan    时间: 2014-11-28 17:57

回复 9# DAIC
代码很强大,我也学习了。




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