Board logo

标题: [文件操作] [已解决]批处理如何取得前导(前缀)为0的系列数字? [打印本页]

作者: xuexidos    时间: 2016-2-27 22:30     标题: [已解决]批处理如何取得前导(前缀)为0的系列数字?

功能需求:
文件夹下有很多jpg文件  名字没有规则
我想实现统一命名规则
例如:         w345we.jpg                   efo33.jpg                 fweoifwe.jpg
统一命名按照   2016-0001SOHU.jpg            2016-0002SOHU.jpg         2016-0003SOHU.jpg
规则,前面2016-和后面的SOHU不变  序号增加 从0001开始,有多少增加到多少。
并记录  原文件名,新文件名,文件创建的时间(精确到分钟) ,大小 信息输出到文本文件中。

我写了下面的代码
  1. @echo off&setlocal EnableDelayedExpansion  
  2.     set a=1
  3.     for /f "delims=" %%i in ('dir /b *.jpg') do (
  4.     rename "%%i" "2016-!a!SOHU.jpg"
  5.     set b='dir 2016-!a!SOHU.jpg'
  6.     echo %%i,2016-!a!SOHU.jpg
  7.    set /a a+=1  
  8.     )  
  9. pause
复制代码
但输出的是2016-1SOHU.jpg  不是我想要的2016-0001SOHU.jpg  
我想应该是先判断文件名是几个字符,然后在前面补0 ,可是不会写了。求帮助。
或者有更简单的办法???
作者: bailong360    时间: 2016-2-27 23:44

本帖最后由 bailong360 于 2016-2-28 13:18 编辑
  1. //&cls&@dir /a-d /b *.jpg|cscript -nologo -e:jscript "%~f0"&pause&exit
  2. var FSO  = new ActiveXObject('Scripting.FileSystemObject');
  3. var file = FSO.OpenTextFile('list.txt', 2, true);
  4. var i = 0;
  5. while (!WSH.StdIn.AtEndOfStream) {
  6.     i += 1;
  7.     var oldfile = FSO.GetFile(WSH.StdIn.ReadLine());
  8.     var s = '000' + i;
  9.     var newname = '2016-' + s.substring(s.length - 4) + 'SOHU.jpg';
  10.     file.Write(oldfile.Name + ',' + newname + ',' + oldfile.DateCreated + ',' + oldfile.Size + '\n');
  11.     oldfile.Name = newname;
  12. }
  13. file.Close();
复制代码
js练手
保存为.bat文件执行
作者: codegay    时间: 2016-2-28 03:29

然而这只是批处理命令,并不是DOS。根本不是一个概念。
作者: xuexidos    时间: 2016-2-28 08:38

还是非常感谢。js代码看不懂。
呵呵,知道dos和批处理不是一回事,只是名字而已。有点误会了。
作者: bailong360    时间: 2016-2-28 13:02

回复 4# xuexidos b
并不需要看懂
当作一个bat执行就行了
作者: /zhqsystem/zhq    时间: 2016-2-28 13:58

本帖最后由 /zhqsystem/zhq 于 2016-2-28 13:59 编辑

回复 1# xuexidos
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in ('dir/ad/s/b/l/on ".\"')do (
  3. for /f "tokens=1,* delims=:" %%j in ('dir/a-d/b/l/on "%%~fi\*.*"^|findstr/n .')do if /i not "%%~nxi"=="%~nx0" (
  4.   set "n=%%j"
  5.   for /l %%l in (0,1,8191)do set "n=0!n!"
  6.   for %%l in (10)do set "n=!n:~-%%l,%%l!"
  7.   echo,"%%i\%%k" "%%i\2016-!n!%%k"
  8. )
  9. )
  10. pause
复制代码

数字序列核心区域代码
作者: xuexidos    时间: 2016-2-28 16:05

回复 6# /zhqsystem/zhq


    没通过。
作者: bailong360    时间: 2016-2-28 16:16

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%i in ('dir /a-d /b *.jpg') do (
  4.     set /a n+=1
  5.     set nn=000!n!
  6.     ren "%%i" "2016-!nn:~-4!SOHU.jpg"
  7.     echo "%%i","2016-!nn:~-4!SOHU.jpg"
  8. )
  9. pause
复制代码
批处理版,仅更名
作者: xuexidos    时间: 2016-2-28 19:15

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%i in ('dir /a-d /b /o:d  *.jpg') do (
  4.     set temp_time=%%~ti
  5.     set temp_size=%%~zi
  6.     set /a n+=1
  7.     set nn=000!n!
  8.     ren "%%i" "2016-!nn:~-4!SOHU.jpg"
  9.     echo "%%i","2016-!nn:~-4!SOHU.jpg",!temp_time:~,20!,!temp_size!
  10. )
  11. pause
复制代码
已经解决,谢谢8楼DX。  从后面截取4个字符,开始没想到。
作者: WHY    时间: 2016-2-29 19:30

回复 9# xuexidos


    %%~ti —— 将 %%i 扩展到文件的修改时间,而不是文件的创建时间
作者: ksla    时间: 2016-2-29 19:44

回复 10# WHY


    哥们,,能不能帮忙改改我的代码
作者: WHY    时间: 2016-2-29 19:49

练习下 PowerShell
  1. dir *.jpg | `
  2. %{ $n=10001 }{
  3.     $hash = @{} | select -Property OldName, NewName, CreationTime, Size
  4.     $hash.OldName = $_.Name
  5.     $hash.NewName = '2016-' + ('' + $n++).SubString(1) + 'soho.jpg'
  6.     $hash.CreationTime = $_.CreationTime.ToString('yyyy-MM-dd HH:mm')
  7.     $hash.Size = $_.length
  8.     ren $_.FullName -NewName $hash.NewName
  9.     $hash
  10. } | Out-file result.log -Width 80
复制代码





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