求个批量改名的bat
本帖最后由 qh6420933 于 2018-4-23 14:33 编辑求个批量改名的bat
改当前文件夹下文件名 文件名18位字母+数字 随机的 并记录源文件和改后的文件名到log.txt中 中间用,隔开
自己弄了一下午也没弄好 求一个{:1_186:}
谢谢大家 自己用较笨的方法弄完了 bat+excel 本帖最后由 dos时代菜鸟 于 2018-4-26 10:42 编辑
这个是 cmd 版本 的 ,把 要处理的 目录 拖放给 rnd.cmd 就是 实现变更,并生成一个 记录文件。把记录文件 拖放给un_rnd.cmd 就会还原变更。
支持子目录
rnd2.cmd
@echo off
setlocal ENABLEDELAYEDEXPANSION
COLOR 0A
if "%~1"=="" goto :eof
set Change="%~dp0%date:/=.%_%time::=.%.txt"
for /f "delims=" %%xin ('dir /b /s /a-d "%~1"') do (
:rnd2
call :rnd1
if exist "%%~dpx""!l!" goto rnd2
:rnd2_end
echo "%%x" -----^> "!l!"
echo "%%~dpx"^|"%%~nxx"^|"!l!" >>!Change!
ren "%%x" "!l!"
)
pause
goto :eof
:rnd1
set "str=abcdefghijklmnopqrstuvwxyz0123456789"
set "l="
for /l %%c in (1,1,16) do (
set /a "r=!random!%%36"
for /l %%e in (0,1,35) do (if %%e equ !r!set "l=!l!!str:~%%e,1!" )
)
楼主看看这个行不。 nmscl 发表于 2018-4-21 06:16
楼主看看这个行不。
好像不行 不过还是谢谢了 本帖最后由 nttwqz 于 2018-4-21 09:38 编辑
这么多年一直记得并使用的批量更名软件
http://www.ffhome.com/works/1406.html 想当年还是从电脑爱好者上面知道的 我有一个类似的VBS脚本要不要? 本帖最后由 上帝是笨蛋 于 2018-4-21 12:53 编辑
On Error Resume Next
Dim objFSO, objFolder, objFile, fLog, Argus, strSuffix, mFolder, mArray(), oldName, newName, I, n
'Set Argus = wscript.arguments'可接收BAT调用时传递的参数
'mFolder = Argus(0)'取第一个参数
If mFolder = "" Then mFolder = "." '设置默认目录为脚本所在目录
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder(mFolder)
Set fLog = objFSO.CreateTextFile(objFolder.Path & "\" & Format(Now(), "yyyymmddhhssmm") & ".log", True)
ReDim mArray(0)
For Each objFile In objFolder.Files
strSuffix = LCase(objFSO.getextensionname(objFile))
If strSuffix <> "vbs" And strSuffix <> "log" Then
If Err.Number = 0 Then
ReDim Preserve mArray(UBound(mArray) + 1)
mArray(UBound(mArray)) = objFile.Path
Else
Exit For
End If
End If
Next
If Err.Number = 0 Then
Randomize
For n = 1 To UBound(mArray)
strSuffix = LCase(objFSO.getextensionname(mArray(n)))
newName = SetFileName(18) & "." & strSuffix
objFSO.Movefile mArray(n), objFolder.Path & "\" & newName
If Err.Number <> 0 Then Exit For
fLog.WriteLine (objFSO.GetFileName(mArray(n)) & ",,,,," & newName)
Next
End If
If Err.Number <> 0 Then
fLog.WriteLine ("Error:" & Err.Description & "," & Err.Number)
MsgBox "Error:" & Err.Description & "," & Err.Number, vbOKOnly, "程序运行错误,即将退出……"
End If
fLog.Close
Set fLog = Nothing
Set objFile = Nothing
Set objFolder = Nothing
Set objFSO = Nothing
Function SetFileName(n)
Dim I, mRnd, nRndI, ReStr
For I = 1 To n
nRndI = 0
Do While (((mRnd > 90 And mRnd < 97) Or (mRnd > 57 And mRnd < 65)) And nRndI < 76) Or nRndI = 0
mRnd = Int((122 - 48 + 1) * Rnd + 48)
nRndI = nRndI + 1
Loop
ReStr = ReStr & Chr(mRnd)
Next
SetFileName = ReStr
End Function 本帖最后由 上帝是笨蛋 于 2018-4-21 12:27 编辑
重复了 上帝是笨蛋 发表于 2018-4-21 11:51
On Error Resume Next
Dim objFSO, objFolder, objFile, fLog, Argus, strSuffix, mFolde ...
本帖最后由 窄口牛 于 2018-4-21 19:29 编辑
找到个神器,批处理之家的
:: rstr.bat --- 生成随机字符串
:: v1.00 / 2013-6-12 / tmplinshi
@echo off
setlocal enabledelayedexpansion
if "%~1" == "/?" goto usage
:: ------------------- 默认值 -------------------
set d_len=10
set d_StrList=abcdefghijklmnopqrstuvwxyz0123456789
:: ----------------------------------------------
:: =================
:: 生成随机字符串
:: =================
::
rem ############## 获取字符个数
if "%~1" == "" (set len=%d_len%) else (set "len=%~1")
rem 随机“最小字符个数-最大字符个数”
if "%len:-=%" neq "%len%" (
for /f "tokens=1,2 delims=- " %%a in ("%len%") do (
set /a min_len = %%a, max_len = %%b
set /a "len = %random% %% (max_len-min_len+1) + min_len"
)
)
rem ############## 获取字符串
if "%~2" == "" (
set StrList=%d_StrList%
) else (
set "StrList=%~2"
rem 替换正则
set StrList=!StrList:\d=0123456789!
set StrList=!StrList:=0123456789!
set StrList=!StrList:=abcdefghijklmnopqrstuvwxyz!
set StrList=!StrList:=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!
)
rem ############## 计算字符串长度
call :StrLen "%StrList%"
rem ############## 生成随机字符串
set _out=
for /l %%n in (1 1 %len%) do (
set /a pos = !random! %% StrLen
for %%p in (!pos!) do set _out=!_out!!StrList:~%%p,1!
)
rem ############## 输出结果
echo,!_out!
exit /b
:: =================
:: 计算字符串长度
:: =================
::
:StrLen <string>
set "_StrList=%~1"
set StrLen=1
for %%a in (2048 1024 512 256 128 64 32 16) do (
if "!_StrList:~%%a!" neq "" (
set /a StrLen += %%a
set _StrList=!_StrList:~%%a!
)
)
set _StrList=!_StrList!fedcba9876543210
set /a StrLen += 0x!_StrList:~16,1!
goto :eof
:: =================
:: 显示帮助
:: =================
::
:usage
echo %~nx0 --- 生成随机字符串
echo,
echo 用法: %~n0 [字符个数 ^| 最小字符个数-最大字符个数] [字符串]
echo [字符个数] 默认值: 10
echo [字符串] 默认值: abcdefghijklmnopqrstuvwxyz0123456789
echo 可以使用四个正则: \d
echo,
echo 示例: %~n0
echo %~n0 10
echo %~n0 10-15
echo %~n0 10 "0123&abc"
echo %~n0 "" \d@-_
@echo off
Setlocal enabledelayedexpansion
FOR /L %%n IN (1,1,16) DO 随机工具 18>>2.txt
pause
uvsmz8895oa4jfrgqn
da73i2rfufmv6o3yzf
xvt61uejftfmd81iig
ein74i394n9fh5z07h
3isunu0vtnpwt7d89y
xqxqswu410vdws5yzf
e4amvbanw3i72rr7gg
1zpu1tkv3qrrbhi33t
slbpiwh90trlpp9gmp
jyhz0nhjktx2lbmvek
m38chgxr7w0hrxfmep
33g40qlxuvv61sxdjy
tyvis6k9bbe6d6ux0d
k1c3eeh8vx38r2bvid
2xprfgc9bvl88wu480
o8xx0tt0tvl8ar833t
窄口牛 发表于 2018-4-21 19:06
刚才是把不能在脚本中运行的函数写了进来,以下是我重写的脚本,已经过我的测试。
On Error Resume Next
Dim objFSO, objFolder, objFile, fLog, fLogName, Argus, strSuffix, mFolder, mArray(), oldName, newName, I, n
Set Argus = wscript.arguments'可接收BAT调用时传递的参数
mFolder = Argus(0)'取第一个参数
If mFolder = "" Then mFolder = "." '设置默认目录为脚本所在目录
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder(mFolder)
fLogName = objFSO.GetFolder(".").Path & "\执行结果报告" & int(rnd*100) & ".log"
Set fLog = objFSO.CreateTextFile(fLogName, , True)
ReDim mArray(0)
For Each objFile In objFolder.Files
strSuffix = LCase(objFSO.getextensionname(objFile))
If strSuffix <> "vbs" And strSuffix <> "log" Then
If Err.Number = 0 Then
ReDim Preserve mArray(UBound(mArray) + 1)
mArray(UBound(mArray)) = objFile.Path
Else
Exit For
End If
End If
Next
If Err.Number = 0 Then
Randomize
For n = 1 To UBound(mArray)
strSuffix = LCase(objFSO.getextensionname(mArray(n)))
newName = SetFileName(18) & "." & strSuffix
objFSO.Movefile mArray(n), objFolder.Path & "\" & newName
If Err.Number <> 0 Then Exit For
fLog.WriteLine (objFSO.GetFileName(mArray(n)) & ",,,,," & newName)
Next
End If
If Err.Number <> 0 Then
fLog.WriteLine ("Error:" & Err.Description & "," & Err.Number)
MsgBox "Error:" & Err.Description & "," & Err.Number, vbOKOnly, "程序运行错误,即将退出……"
End If
fLog.Close
Set fLog = Nothing
Set objFile = Nothing
Set objFolder = Nothing
Set objFSO = Nothing
Function SetFileName(n)
Dim I, mRnd, nRndI, ReStr
For I = 1 To n
nRndI = 0
Do While (((mRnd > 90 And mRnd < 97) Or (mRnd > 57 And mRnd < 65)) And nRndI < 76) Or nRndI = 0
mRnd = Int((122 - 48 + 1) * Rnd + 48)
nRndI = nRndI + 1
Loop
ReStr = ReStr & Chr(mRnd)
Next
SetFileName = ReStr
End Function 上帝是笨蛋 发表于 2018-4-21 21:32
刚才是把不能在脚本中运行的函数写了进来,以下是我重写的脚本,已经过我的测试。
On Error Res ...
win10运行显示 数组下标越界 上帝是笨蛋 发表于 2018-4-21 21:32
刚才是把不能在脚本中运行的函数写了进来,以下是我重写的脚本,已经过我的测试。
On Error Res ...
win10运行显示 数组下标越界 qh6420933 发表于 2018-4-23 14:31
win10运行显示 数组下标越界
我是在Win8下测试的,Win8与Win10居然还有这么大的区别? 本帖最后由 上帝是笨蛋 于 2018-4-23 14:56 编辑
我在我的WIN10系统下测试没有问题呀。 我把我的测试结果部分发出来你看一下:
BAT命令行:Call 批量修改为字母+数字的随机文件名.vbs H:\Temp
执行结果:
rujrt (1).txt,,,,,hnWWU7O4RfFNh8Wjjt.txt
rujrt (10).txt,,,,,eBkRTXPCCmfC6f3JnX.txt
rujrt (100).txt,,,,,bRkHjDZ6FVizFaH6EG.txt
rujrt (101).txt,,,,,lFr9kFJd5cpiP9ADAD.txt
rujrt (102).txt,,,,,lxnT7MIXSykjmV4L60.txt
rujrt (103).txt,,,,,XGNYfWSKd4WQtHISfT.txt
rujrt (104).txt,,,,,FYoCkntYb9ZBsjloYH.txt
rujrt (105).txt,,,,,7RSZS5gIz3UFjXexHg.txt
rujrt (106).txt,,,,,Zd03OkMlYGAI7URcjk.txt
rujrt (107).txt,,,,,DwUHpmAILrULzZ8xmC.txt
rujrt (108).txt,,,,,dPulAjP542dhQdHiMH.txt
rujrt (109).txt,,,,,NJpxdXErVoEL0rIbT3.txt
rujrt (11).txt,,,,,5PLtpEMOz1aPYwKuBy.txt
rujrt (110).txt,,,,,GquSw1TlNwd1E4QoqF.txt
rujrt (111).txt,,,,,pJFOtNPZP9ZNLoal3t.txt
rujrt (112).txt,,,,,SUkVUGvYpUVEl2vcPw.txt
rujrt (113).txt,,,,,8TRoxZLzQnOcBHOXzI.txt
rujrt (114).txt,,,,,VZHjpAQE2vwS37uuqv.txt
rujrt (115).txt,,,,,00eCOzNEVc27ZH1fC9.txt
rujrt (116).txt,,,,,qX1Iin18CBSvzeJffW.txt
rujrt (117).txt,,,,,7fyav9et4HZbqLCal3.txt
rujrt (118).txt,,,,,Q9ju3fS0UNT5BZ3S4Q.txt
rujrt (119).txt,,,,,lICZOhXWTxqpc2rF9b.txt
rujrt (12).txt,,,,,H3DkEClWBb5Of0yL9H.txt
rujrt (120).txt,,,,,UUPQ8GfnA5eTTvLfyU.txt
………… 上帝是笨蛋 发表于 2018-4-23 14:55
我在我的WIN10系统下测试没有问题呀。 我把我的测试结果部分发出来你看一下:
BAT命令行:Call 批量修改 ...
谢谢了都弄完了有时间研究下 我这里也是提示下标错误,会不会是因为中文路径? 本帖最后由 dos时代菜鸟 于 2018-4-24 09:13 编辑
生成 随机文件名 用这个 ,怎么改名 啥的,再研究。
先看这个行不行
Set os=CreateObject("Wscript.shell")
wscript.echo namex
Function namex()
str="a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,0,1,2,3,4,5,6,7,8,9"
namex=""
Randomize '初始化随机数生成器。
For n=1 To 16
MyValue = Int(36 * Rnd+1) ' 产生 1 到 36 之间的随机数。
namex=namex&split(str,",")(myvalue-1)
Next
end Function
字母+数字 一共不过 36个 字符,循环16次,生成16个 1-36 的随机数,再转化成 对应的 字符,组合起来就是一个 符合要求的 字符串了。 本帖最后由 dos时代菜鸟 于 2018-4-24 10:01 编辑
把 需要 操作的文件夹 拖放 给这个 vbs 就可以实现了。vbs 脚本旁边会 多出一个change.txt 文件 就是 变更记录。
不处理 子目录 内容。
先将 目标文件夹 中的文件 名称存入一个 old.txt 文件,
在 循环读取old.txt 内容,把 其包含的文件 更名,并将 更名过程写入 change.txt 文件中
脚本包含一个随机生成包含字符和数字的16位字符串 的函数。
Set os=CreateObject("Wscript.shell")
set fs=createobject("scripting.filesystemobject")
If WScript.Arguments.Count=0 Then
wscirpt.echo "没有参数!"
wscirpt.quit
End If
pathx=fs.GetFile(WScript.scriptFullName).ParentFolder.Path
Set dir0=fs.getfolder(WScript.Arguments(0))
Set Change=fs.OpenTextFile(pathx&"\Change.txt",2,True)
Set Old=fs.OpenTextFile(pathx&"\Old.txt",2,True)
For Each p0 In dir0.Files
OLD.WriteLine p0.ParentFolder&"\"&p0.Name
Next
old.Close
Set Old=fs.OpenTextFile(pathx&"\Old.txt",1,false)
DO While old.AtEndOfStream <> True
Change_name=namex()
Do while fs.FileExists(change_name)=True
Change_name=namex()
Loop
Set p0=fs.GetFile(old.readline)
Change.WriteLine p0.ParentFolder&"\"&p0.Name&" , "&p0.ParentFolder&"\"&Change_name
fs.MoveFile p0,p0.ParentFolder&"\"&Change_name
loop
old.Close
change.Close
Function namex()
str="a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,0,1,2,3,4,5,6,7,8,9"
namex=""
Randomize '初始化随机数生成器。
For n=1 To 16
MyValue = Int(36 * Rnd+1) ' 产生 0 到 35 之间的随机数。
'WScript.Echo myvalue
namex=namex&split(str,",")(myvalue-1)
Next
end Function
随机字符 我百度的 就是改名 没套明白
@echo off
set n=18
rem n=3意思要生成3个随机字符串,如要10个修改n=10
rem 开启变量延迟
set str=abcdefghijkmnopqrstuvwxyz023456789023456789
set nu=0
:zf
setlocal enabledelayedexpansion
for /l %%c in (1,1,%n%) do call :slz "%%c"
rem for循环n次,因为每循环一次得到1个随机字符串,n次便是n个随机字符串
echo %random_str%>>随机字符.txt
endlocal
set /a nu+=1
cls
echo 已生成%nu%个随机字符
goto :zf
:slz
if "%~1"=="" goto:eof
set /a r=%random%%%43
rem 生成小于36的随机数(26个字母加10个数字等于36很好理解的)
set random_str=%random_str%!str:~%r%,1! 下标越界可能是vbs支持60随机,62就越界?
26+26+10是62 本帖最后由 dos时代菜鸟 于 2018-4-24 10:10 编辑
窄口牛 发表于 2018-4-24 09:33
下标越界可能是vbs支持60随机,62就越界?
26+26+10是62
大小写 在 win 下是一样的 ,所以 36 就 够了。
我 刚弄了个脚本 ,应该是可行的。
通常 还是 不要把 脚本 放到 要处理 的文件夹中运行的。
vbs 中数组操作也要注意 ,个数 和 数组下标 不一致,差了一个
下标越界
应该是这个问题
把
For n = 1 To UBound(mArray)
应该改成
For n = 0 To UBound(mArray-1) 有道理。 本帖最后由 dos时代菜鸟 于 2018-4-24 10:35 编辑
窄口牛 发表于 2018-4-24 10:10
有道理。
改名
与
还原
存储 变更记录 的文件 ,新名 与 旧名 不应用逗号 作为间隔符号,因为 逗号可以参与 文件命名,文件名中有逗号 就不好处理了,所以 应该用/这样不能用来 参与命名的 字符 作为 两个文件名 间的隔断。
试试看~~~~~~~~~~~~~
页:
[1]