[解决]纯数字连续文件名“添0”“补齐位数”,用批处理及VBS怎么写?
本帖最后由 netmjwork 于 2018-3-24 18:46 编辑希望实现效果:
将 1、2、3……10、999这样的连续纯数字文件名(没有扩展名)批量修改成001、002、003……010……999这样的,就是将原有数字前不带 0 的名称,全部添加 0 ,且位数和最大位数一致,上面举例是3位的,如果是4位、5位的怎么来写?
注:要求修改后的文件名称和原来文件一致,并不是重新命名然后格式改变,批处理或VBS和纯数字文件名在同一目录下 au3的话可以这样,其他语言就不懂了
For $i = 1 To 999
ConsoleWrite(StringFormat("%03i", $i) & @CRLF)
Next
本帖最后由 窄口牛 于 2018-3-19 19:55 编辑
@echo off
setlocal EnableDelayedExpansion
set a=1
if !a! lss 10 (echo ren !a! 00!a!) else (
if !a! lss 100 (echo ren !a! 0!a!)
)
set /a a+=1 本帖最后由 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!
) 哈哈哈哈,我习惯用楼上的方法, 这是我常用的一个脚本,希望对你有用。
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 窄口牛 发表于 2018-3-19 19:43
感谢,不过运行没有任何反应…… 本帖最后由 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”;
已解决:后来发现批处理改中文名称时本身不会被修改,英文或数字就会被精简掉。 江南一根葱 发表于 2018-3-20 09:16
哈哈哈哈,我习惯用楼上的方法,
是好方法,不过8位有点儿长,一般用3-4位用的多,但是有个问题,会吧批处理文件本身给精简没了……
解决了不处理批处理文件本身就更好了 本帖最后由 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
需要修改才能使用。直接只是一个屏显。
生手代码没看懂,希望指点下,非常感谢!
比如说将199以内的数字文件名称修改成0001-0199这样的格式怎么修改? 4位
如果还是199以内的数字文件名称修改成000001-000199这样的格式怎么修改? 6位
举例更容易理解,谢谢! @echo off
setlocal EnableDelayedExpansion
set dir=G:\1233
FOR /L %%a IN (1,1,200) DO (
if %%a lss 10 (echo ren %dir%\%%a %dir%\000%%a) else (
if %%a lss 100 (echo ren %dir%\%%a %dir%\00%%a) else (
echo ren %dir%\%%a %dir%\0%%a)))
pause
删除三个echo就会实际执行重命名
把路径改成你要改文件的路径 上帝是笨蛋 发表于 2018-3-20 13:44
这是我常用的一个脚本,希望对你有用。
On Error Resume Next
Dim strSet, arrSet, strSuffix, selfName
...
对了,您能用VBS帮忙写一个代码吗?如果能用VBS实现那更方便,运行后也没有弹出窗口,谢谢!
按楼上“dos时代菜鸟”的思路 : 名称都 前面先加8个零,然后再截取后8位 dos时代菜鸟 发表于 2018-3-19 19:48
把名字 都 前加8个零,再截取后8位
set "name=00000000%name%"
请老师指点下:
set "name=00000000%%c" 这里的8个零,代表名称前面都添加的字符,对吧?
ren %%c !name:~-8,8! 这里的两个8,前后分别代表什么含义呢?
非常感谢! 窄口牛 发表于 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
当前目录,那你就把这个放到要改的文件中间。
谢谢!
还是不行,提示找不到文件
还是先用那个添加8个0再删除的批处理吧 netmjwork 发表于 2018-3-22 21:12
请老师指点下:
set "name=00000000%%c" 这里的8个零,代表名称前面都添加的字符,对吧?
之前学习set命令网上找的,你看过之后就明白了。
!name:~-8,8! 可以简写作 !name:~-8!
如果你要3位,只需要8改成3即可,0可以任意写,补两个0,至少应该有两个0 nttwqz 发表于 2018-3-22 23:00
之前学习set命令网上找的,你看过之后就明白了。
!name:~-8,8! 可以简写作 !name:~-8!
感谢指点!这下明白具体含义了~ 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-23 14:30
On Error Resume Next
Dim objFSO, objFolder, objFile, strSuffix, mArray(), oldName, n ...
感谢分享,好用!
学习下用的参数
页:
[1]