无忧启动论坛

标题: [解决]纯数字连续文件名“添0”“补齐位数”,用批处理及VBS怎么写? [打印本页]

作者: netmjwork    时间: 2018-3-19 18:26
标题: [解决]纯数字连续文件名“添0”“补齐位数”,用批处理及VBS怎么写?
本帖最后由 netmjwork 于 2018-3-24 18:46 编辑

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

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


作者: 窄口牛    时间: 2018-3-19 19:43
本帖最后由 窄口牛 于 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
复制代码

作者: dos时代菜鸟    时间: 2018-3-19 19:48
本帖最后由 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!
)
作者: 江南一根葱    时间: 2018-3-20 09:16
哈哈哈哈,我习惯用楼上的方法,
作者: 上帝是笨蛋    时间: 2018-3-20 13:44
这是我常用的一个脚本,希望对你有用。
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
作者: netmjwork    时间: 2018-3-22 19:28
窄口牛 发表于 2018-3-19 19:43

感谢,不过运行没有任何反应……
作者: netmjwork    时间: 2018-3-22 19:35
本帖最后由 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”;

已解决:后来发现批处理改中文名称时本身不会被修改,英文或数字就会被精简掉。
作者: netmjwork    时间: 2018-3-22 19:36
江南一根葱 发表于 2018-3-20 09:16
哈哈哈哈,我习惯用楼上的方法,

是好方法,不过8位有点儿长,一般用3-4位用的多,但是有个问题,会吧批处理文件本身给精简没了……
解决了不处理批处理文件本身就更好了
作者: netmjwork    时间: 2018-3-22 19:39
本帖最后由 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的数字,否则会很麻烦……


作者: 窄口牛    时间: 2018-3-22 19:43
需要修改才能使用。直接只是一个屏显。
作者: netmjwork    时间: 2018-3-22 20:07
窄口牛 发表于 2018-3-22 19:43
需要修改才能使用。直接只是一个屏显。

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

举例更容易理解,谢谢!
作者: 窄口牛    时间: 2018-3-22 20:37
  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就会实际执行重命名
把路径改成你要改文件的路径
作者: netmjwork    时间: 2018-3-22 20:51
上帝是笨蛋 发表于 2018-3-20 13:44
这是我常用的一个脚本,希望对你有用。
On Error Resume Next
Dim strSet, arrSet, strSuffix, selfName
...

对了,您能用VBS帮忙写一个代码吗?如果能用VBS实现那更方便,运行后也没有弹出窗口,谢谢!
按楼上“dos时代菜鸟”的思路 : 名称都 前面先加8个零,然后再截取后8位
作者: netmjwork    时间: 2018-3-22 21:12
dos时代菜鸟 发表于 2018-3-19 19:48
把名字 都 前加8个零,再截取后8位

set "name=00000000%name%"

请老师指点下:

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

非常感谢!
作者: netmjwork    时间: 2018-3-22 21:26
窄口牛 发表于 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
作者: 窄口牛    时间: 2018-3-22 21:42
当前目录,那你就把这个放到要改的文件中间。
作者: netmjwork    时间: 2018-3-22 22:01
窄口牛 发表于 2018-3-22 21:42
当前目录,那你就把这个放到要改的文件中间。

谢谢!
还是不行,提示找不到文件
还是先用那个添加8个0再删除的批处理吧
作者: nttwqz    时间: 2018-3-22 23:00
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


作者: netmjwork    时间: 2018-3-23 08:35
nttwqz 发表于 2018-3-22 23:00
之前学习set命令网上找的,你看过之后就明白了。

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

感谢指点!这下明白具体含义了~
作者: 上帝是笨蛋    时间: 2018-3-23 14:30
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
作者: netmjwork    时间: 2018-3-24 13:00
上帝是笨蛋 发表于 2018-3-23 14:30
On Error Resume Next
   
   Dim objFSO, objFolder, objFile, strSuffix, mArray(), oldName, n ...

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




欢迎光临 无忧启动论坛 (http://bbs.wuyou.net/) Powered by Discuz! X3.3