[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文件操作] [已解决]批处理如何取得前导(前缀)为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 ,可是不会写了。求帮助。
或者有更简单的办法???
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

本帖最后由 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文件执行

TOP

然而这只是批处理命令,并不是DOS。根本不是一个概念。
去学去写去用才有进步。安装python3代码存为xx.py 双击运行或右键用IDLE打开按F5运行

TOP

还是非常感谢。js代码看不懂。
呵呵,知道dos和批处理不是一回事,只是名字而已。有点误会了。

TOP

回复 4# xuexidos b
并不需要看懂
当作一个bat执行就行了

TOP

本帖最后由 /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
复制代码

数字序列核心区域代码
这么好的论坛你上哪找,运行测试环境为6.1.7601-64
注:请遵守互联网信息安全,勿用于非法用途

TOP

回复 6# /zhqsystem/zhq


    没通过。

TOP

  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
复制代码
批处理版,仅更名
1

评分人数

TOP

  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个字符,开始没想到。

TOP

回复 9# xuexidos


    %%~ti —— 将 %%i 扩展到文件的修改时间,而不是文件的创建时间

TOP

回复 10# WHY


    哥们,,能不能帮忙改改我的代码

TOP

练习下 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
复制代码

TOP

返回列表