无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 15543|回复: 22
打印 上一主题 下一主题

[求助] [解决]纯数字连续文件名“添0”“补齐位数”,用批处理及VBS怎么写?

[复制链接]
跳转到指定楼层
1#
发表于 2018-3-19 18:26:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 netmjwork 于 2018-3-24 18:46 编辑

希望实现效果:
将 1、2、3……10、999这样的连续纯数字文件名(没有扩展名)批量修改成001、002、003……010……999这样的,就是将原有数字前不带 0 的名称,全部添加 0 ,且位数和最大位数一致,上面举例是3位的,如果是4位、5位的怎么来写?

注:要求修改后的文件名称和原来文件一致,并不是重新命名然后格式改变,批处理或VBS和纯数字文件名在同一目录下
2#
发表于 2018-3-19 19:24:19 | 只看该作者
au3的话可以这样,其他语言就不懂了
  1. For $i = 1 To 999
  2.         ConsoleWrite(StringFormat("%03i", $i) & @CRLF)
  3. Next
复制代码

点评

感谢分享,AU3还得装软件才能用~  发表于 2018-3-22 19:24
回复

使用道具 举报

3#
发表于 2018-3-19 19:43:12 | 只看该作者
本帖最后由 窄口牛 于 2018-3-19 19:55 编辑
  1. @echo off
  2. setlocal EnableDelayedExpansion
  3. set a=1
  4. if !a! lss 10 (echo ren !a! 00!a!) else (
  5. if !a! lss 100 (echo ren !a! 0!a!)
  6. )
  7. set /a a+=1
复制代码

点评

感谢,不过运行没有任何反应……  详情 回复 发表于 2018-3-22 19:28
回复

使用道具 举报

4#
发表于 2018-3-19 19:48:23 | 只看该作者
本帖最后由 dos时代菜鸟 于 2018-3-19 20:03 编辑

把名字 都 前加8个零,再截取后8位

set "name=00000000%name%"
set "name=%name:~-8,8%"


支持最大8位数


@echo off
setlocal ENABLEDELAYEDEXPANSION
for %%c in (*) do (
        set "name=00000000%%c"
        ren %%c !name:~-8,8!
)

点评

请老师指点下: set "name=00000000%%c" 这里的8个零,代表名称前面都添加的字符,对吧? ren %%c !name:~-8,8! 这里的两个8,前后分别代表什么含义呢? 非常感谢!  详情 回复 发表于 2018-3-22 21:12
好办法,简单有效~ 谢谢分享! 有个小问题,怎么加命令排除掉批处理文件本身? 比如:修改成截取4位的命令,其他文件都不带后缀,一般也就3-4位,批处理本身加 .bat 最少都是 4位数了,批处理运行后批处理本  详情 回复 发表于 2018-3-22 19:35
回复

使用道具 举报

5#
发表于 2018-3-20 09:16:44 | 只看该作者
哈哈哈哈,我习惯用楼上的方法,

点评

是好方法,不过8位有点儿长,一般用3-4位用的多,但是有个问题,会吧批处理文件本身给精简没了…… 解决了不处理批处理文件本身就更好了  详情 回复 发表于 2018-3-22 19:36
回复

使用道具 举报

6#
发表于 2018-3-20 13:44:33 | 只看该作者
这是我常用的一个脚本,希望对你有用。
On Error Resume Next
Dim strSet, arrSet, strSuffix, selfName
Do While InStr(1, strSet, ",") = 0
   strSet = InputBox("请按照“前辍+填充数字长度+指定更改的文件类型”方式输入参数,中间用逗号隔开。" & Chr(10) & "例:“ 三亚,5,jpg ”或“ *,6,* ”,“*”代表纯数字文件名或全部类型的文件。", "请输入重命名参数", "*,5,JPG")
   strSet = Replace(Replace(Replace(strSet, ",", ","), " ", ""), " ", "")
   If strSet = "" Then
      MsgBox "没有输入任何有效参数,请继续……"
   Else
      arrSet = Split(LCase(strSet), ",")
      If UBound(arrSet) < 2 Then
         MsgBox "输入的参数不完整,请继续……"
         strSet = ""
      End If
   End If
Loop

If arrSet(0) = "*" Then arrSet(0) = ""
If arrSet(1) = "*" Or arrSet(1) = "" Then arrSet(1) = 5
If arrSet(2) = "" Then arrSet(2) = "*" Else arrSet(2) = LCase(arrSet(2))

Dim objFSO, objFolder, objFile, strPath, oldName, newName, I
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder(".")
I = 1

For Each objFile In objFolder.Files
    strSuffix = LCase(objFSO.getextensionname(objFile))
    If strSuffix <> "vbs" And (arrSet(2) = "*" Or arrSet(2) = strSuffix) Then
       newName = arrSet(0) & String(CInt(arrSet(1)) - Len(CStr(I)) + 1, "0") & I & "." & strSuffix
       objFile.Name = newName
       If Err.Number = 0 Then
          I = I + 1
       Else
          MsgBox "Error:" & Err.Description & Chr(10) & Err.Number, vbOKOnly, "程序运行错误,将退出……"
          Exit For
       End If
    End If
Next
Set objFile = Nothing
Set objFolder = Nothing
Set objFSO = Nothing

点评

对了,您能用VBS帮忙写一个代码吗?如果能用VBS实现那更方便,运行后也没有弹出窗口,谢谢! 按楼上“dos时代菜鸟”的思路 : 名称都 前面先加8个零,然后再截取后8位  详情 回复 发表于 2018-3-22 20:51
很好用,感谢分享!  详情 回复 发表于 2018-3-22 19:39
回复

使用道具 举报

7#
 楼主| 发表于 2018-3-22 19:28:30 | 只看该作者

感谢,不过运行没有任何反应……
回复

使用道具 举报

8#
 楼主| 发表于 2018-3-22 19:35:26 | 只看该作者
本帖最后由 netmjwork 于 2018-3-23 08:40 编辑
dos时代菜鸟 发表于 2018-3-19 19:48
把名字 都 前加8个零,再截取后8位

set "name=00000000%name%"


好办法,简单有效~    谢谢分享!

有个小问题,怎么加命令排除掉批处理文件本身?
比如:修改成截取4位的命令,其他文件都不带后缀,一般也就3-4位,批处理本身加 .bat 最少都是 4位数了,批处理运行后批处理本身名称就剩个“.bat”了……  比如说批处理名称是“test.bat”;

已解决:后来发现批处理改中文名称时本身不会被修改,英文或数字就会被精简掉。
回复

使用道具 举报

9#
 楼主| 发表于 2018-3-22 19:36:48 | 只看该作者
江南一根葱 发表于 2018-3-20 09:16
哈哈哈哈,我习惯用楼上的方法,

是好方法,不过8位有点儿长,一般用3-4位用的多,但是有个问题,会吧批处理文件本身给精简没了……
解决了不处理批处理文件本身就更好了
回复

使用道具 举报

10#
 楼主| 发表于 2018-3-22 19:39:37 | 只看该作者
本帖最后由 netmjwork 于 2018-3-22 20:29 编辑
上帝是笨蛋 发表于 2018-3-20 13:44
这是我常用的一个脚本,希望对你有用。
On Error Resume Next
Dim strSet, arrSet, strSuffix, selfName
...


很好用,感谢分享!

后来发现你这不是我需要的,你这个是完全的重命名,不管原来的名称是什么,全部重命名,而且只能用于小位数改大位数一次,从大位数修改小位数千万别用,我实验瞬间CPU飙红……  还好我是用空文本文件测试的,名称不停的修改变化,一会儿就到3万多了……  vbs进程也结束不掉,只能关机……

两个小问题:
                      1、就是如果不想输入,要退出时,却发现,这是个死循环,根本就没有“退出”的“出口”,右上角关闭还是一直弹窗,无法退出……  应该按“取消”时能够退出
                      2、只是能够从小增加位数,比如从1位调整为3位,不能在输入错误的话从多位调整为少位,比如从8位调整为6位(可以设置为直接删除开头多余的0,截取相应的位数)
                           设置了8位之后,千万别再运行选择小于8的数字,否则会很麻烦……

回复

使用道具 举报

11#
发表于 2018-3-22 19:43:07 来自手机 | 只看该作者
需要修改才能使用。直接只是一个屏显。

点评

生手代码没看懂,希望指点下,非常感谢! 比如说将199以内的数字文件名称修改成0001-0199这样的格式怎么修改? 4位 如果还是199以内的数字文件名称修改成000001-000199这样的格式怎么修改? 6位 举例更容易理解  详情 回复 发表于 2018-3-22 20:07
回复

使用道具 举报

12#
 楼主| 发表于 2018-3-22 20:07:16 | 只看该作者
窄口牛 发表于 2018-3-22 19:43
需要修改才能使用。直接只是一个屏显。

生手代码没看懂,希望指点下,非常感谢!
比如说将199以内的数字文件名称修改成0001-0199这样的格式怎么修改? 4位
如果还是199以内的数字文件名称修改成000001-000199这样的格式怎么修改? 6位

举例更容易理解,谢谢!
回复

使用道具 举报

13#
发表于 2018-3-22 20:37:36 | 只看该作者
  1. @echo off
  2. setlocal EnableDelayedExpansion
  3. set dir=G:\1233
  4. FOR /L %%a IN (1,1,200) DO (
  5. if %%a lss 10 (echo ren %dir%\%%a %dir%\000%%a) else (
  6. if %%a lss 100 (echo ren %dir%\%%a %dir%\00%%a) else (
  7. echo ren %dir%\%%a %dir%\0%%a)))
  8. pause
复制代码

删除三个echo就会实际执行重命名
把路径改成你要改文件的路径

点评

感谢回复,我要运行在当前目录下,替换当前路径之后,运行一直提示“系统找不到指定的”文件…… @echo off setlocal EnableDelayedExpansion set dir=%~dp0 FOR /L %%a IN (1,1,200) DO ( if %%a lss 10 (  详情 回复 发表于 2018-3-22 21:26
回复

使用道具 举报

14#
 楼主| 发表于 2018-3-22 20:51:13 | 只看该作者
上帝是笨蛋 发表于 2018-3-20 13:44
这是我常用的一个脚本,希望对你有用。
On Error Resume Next
Dim strSet, arrSet, strSuffix, selfName
...

对了,您能用VBS帮忙写一个代码吗?如果能用VBS实现那更方便,运行后也没有弹出窗口,谢谢!
按楼上“dos时代菜鸟”的思路 : 名称都 前面先加8个零,然后再截取后8位

点评

On Error Resume Next Dim objFSO, objFolder, objFile, strSuffix, mArray(), oldName, newName, I, n Set objFSO = CreateObject("Scripting.FileSystemObject") Set objFolder = objFSO  详情 回复 发表于 2018-3-23 14:30
回复

使用道具 举报

15#
 楼主| 发表于 2018-3-22 21:12:58 | 只看该作者
dos时代菜鸟 发表于 2018-3-19 19:48
把名字 都 前加8个零,再截取后8位

set "name=00000000%name%"

请老师指点下:

set "name=00000000%%c"          这里的8个零,代表名称前面都添加的字符,对吧?
        ren %%c !name:~-8,8!          这里的两个8,前后分别代表什么含义呢?

非常感谢!

点评

之前学习set命令网上找的,你看过之后就明白了。 !name:~-8,8! 可以简写作 !name:~-8! 如果你要3位,只需要8改成3即可,0可以任意写,补两个0,至少应该有两个0  详情 回复 发表于 2018-3-22 23:00
回复

使用道具 举报

16#
 楼主| 发表于 2018-3-22 21:26:24 | 只看该作者
窄口牛 发表于 2018-3-22 20:37
删除三个echo就会实际执行重命名
把路径改成你要改文件的路径


感谢回复,我要运行在当前目录下,替换当前路径之后,运行一直提示“系统找不到指定的”文件……

@echo off
setlocal EnableDelayedExpansion
set dir=%~dp0
FOR /L %%a IN (1,1,200) DO (
if %%a lss 10 (ren %dir%\%%a %dir%\000%%a) else (
if %%a lss 100 (ren %dir%\%%a %dir%\00%%a) else (
ren %dir%\%%a %dir%\0%%a)))
pause
回复

使用道具 举报

17#
发表于 2018-3-22 21:42:12 来自手机 | 只看该作者
当前目录,那你就把这个放到要改的文件中间。

点评

谢谢! 还是不行,提示找不到文件 还是先用那个添加8个0再删除的批处理吧  详情 回复 发表于 2018-3-22 22:01
回复

使用道具 举报

18#
 楼主| 发表于 2018-3-22 22:01:25 | 只看该作者
窄口牛 发表于 2018-3-22 21:42
当前目录,那你就把这个放到要改的文件中间。

谢谢!
还是不行,提示找不到文件
还是先用那个添加8个0再删除的批处理吧
回复

使用道具 举报

19#
发表于 2018-3-22 23:00:17 | 只看该作者
netmjwork 发表于 2018-3-22 21:12
请老师指点下:

set "name=00000000%%c"          这里的8个零,代表名称前面都添加的字符,对吧?

之前学习set命令网上找的,你看过之后就明白了。

!name:~-8,8! 可以简写作 !name:~-8!

如果你要3位,只需要8改成3即可,0可以任意写,补两个0,至少应该有两个0

set命令字符替换演示.7z

1.11 KB, 下载次数: 5, 下载积分: 无忧币 -2

点评

感谢指点!这下明白具体含义了~  详情 回复 发表于 2018-3-23 08:35
回复

使用道具 举报

20#
 楼主| 发表于 2018-3-23 08:35:05 | 只看该作者
nttwqz 发表于 2018-3-22 23:00
之前学习set命令网上找的,你看过之后就明白了。

!name:~-8,8! 可以简写作 !name:~-8!

感谢指点!这下明白具体含义了~
回复

使用道具 举报

21#
发表于 2018-3-23 14:30:35 | 只看该作者
netmjwork 发表于 2018-3-22 20:51
对了,您能用VBS帮忙写一个代码吗?如果能用VBS实现那更方便,运行后也没有弹出窗口,谢谢!
按楼上“do ...


   On Error Resume Next
   
   Dim objFSO, objFolder, objFile, strSuffix, mArray(), oldName, newName, I, n
   
   Set objFSO = CreateObject("Scripting.FileSystemObject")
   Set objFolder = objFSO.GetFolder(".")
   ReDim mArray(0)
   
   For Each objFile In objFolder.Files
       strSuffix = LCase(objFSO.getextensionname(objFile))
       If strSuffix <> "vbs" Then
          If Err.Number = 0 Then
             ReDim Preserve mArray(UBound(mArray) + 1)
             mArray(UBound(mArray)) = objFile.Path
          Else
             MsgBox "Error:" & Err.Description & Chr(10) & Err.Number, vbOKOnly, "程序运行错误,将退出……"
             Exit For
          End If
       End If
   Next

   For n = 1 To UBound(mArray)
       strSuffix = LCase(objFSO.getextensionname(mArray(n)))
       newName = objFolder.Path & "\" & Right(String(8, "0") & objFSO.GetFileName(mArray(n)), 9 + Len(strSuffix))
       objFSO.Movefile mArray(n), newName
       If Err.Number <> 0 Then
          MsgBox "Error:" & Err.Description & Chr(10) & Err.Number, vbOKOnly, "程序运行错误,将退出……"
          Exit For
       End If
   Next
   Set objFile = Nothing
   Set objFolder = Nothing
   Set objFSO = Nothing

点评

感谢分享,好用! 学习下用的参数  详情 回复 发表于 2018-3-24 13:00
回复

使用道具 举报

22#
 楼主| 发表于 2018-3-24 13:00:38 | 只看该作者
上帝是笨蛋 发表于 2018-3-23 14:30
On Error Resume Next
   
   Dim objFSO, objFolder, objFile, strSuffix, mArray(), oldName, n ...

感谢分享,好用!
学习下用的参数
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-11-27 10:14

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表