qh6420933 发表于 2018-4-20 16:10:53

求个批量改名的bat

本帖最后由 qh6420933 于 2018-4-23 14:33 编辑

求个批量改名的bat
改当前文件夹下文件名 文件名18位字母+数字 随机的 并记录源文件和改后的文件名到log.txt中 中间用,隔开
自己弄了一下午也没弄好 求一个{:1_186:}

谢谢大家 自己用较笨的方法弄完了 bat+excel

dos时代菜鸟 发表于 2018-4-25 11:47:26

本帖最后由 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:45

楼主看看这个行不。

qh6420933 发表于 2018-4-21 09:18:06

nmscl 发表于 2018-4-21 06:16
楼主看看这个行不。

好像不行 不过还是谢谢了

nttwqz 发表于 2018-4-21 09:29:32

本帖最后由 nttwqz 于 2018-4-21 09:38 编辑

这么多年一直记得并使用的批量更名软件

http://www.ffhome.com/works/1406.html

nttwqz 发表于 2018-4-21 09:30:57

想当年还是从电脑爱好者上面知道的

上帝是笨蛋 发表于 2018-4-21 10:03:03

我有一个类似的VBS脚本要不要?

上帝是笨蛋 发表于 2018-4-21 11:51:58

本帖最后由 上帝是笨蛋 于 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 11:55:22

本帖最后由 上帝是笨蛋 于 2018-4-21 12:27 编辑

重复了

窄口牛 发表于 2018-4-21 19:06:34

上帝是笨蛋 发表于 2018-4-21 11:51
On Error Resume Next
   
    Dim objFSO, objFolder, objFile, fLog, Argus, strSuffix, mFolde ...

窄口牛 发表于 2018-4-21 19:07:26

本帖最后由 窄口牛 于 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 21:32:40

窄口牛 发表于 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

qh6420933 发表于 2018-4-23 14:31:54

上帝是笨蛋 发表于 2018-4-21 21:32
刚才是把不能在脚本中运行的函数写了进来,以下是我重写的脚本,已经过我的测试。

    On Error Res ...

win10运行显示 数组下标越界

qh6420933 发表于 2018-4-23 14:31:55

上帝是笨蛋 发表于 2018-4-21 21:32
刚才是把不能在脚本中运行的函数写了进来,以下是我重写的脚本,已经过我的测试。

    On Error Res ...

win10运行显示 数组下标越界

上帝是笨蛋 发表于 2018-4-23 14:43:50

qh6420933 发表于 2018-4-23 14:31
win10运行显示 数组下标越界

我是在Win8下测试的,Win8与Win10居然还有这么大的区别?

上帝是笨蛋 发表于 2018-4-23 14:55:08

本帖最后由 上帝是笨蛋 于 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
…………

qh6420933 发表于 2018-4-23 15:04:22

上帝是笨蛋 发表于 2018-4-23 14:55
我在我的WIN10系统下测试没有问题呀。 我把我的测试结果部分发出来你看一下:

BAT命令行:Call 批量修改 ...

谢谢了都弄完了有时间研究下

窄口牛 发表于 2018-4-23 15:07:29

我这里也是提示下标错误,会不会是因为中文路径?

窄口牛 发表于 2018-4-23 19:13:12

dos时代菜鸟 发表于 2018-4-24 08:31:01

本帖最后由 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 09:30:52

本帖最后由 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

qh6420933 发表于 2018-4-24 09:31:26

随机字符 我百度的 就是改名 没套明白
@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!

窄口牛 发表于 2018-4-24 09:33:45

下标越界可能是vbs支持60随机,62就越界?
26+26+10是62

dos时代菜鸟 发表于 2018-4-24 10:05:03

本帖最后由 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)

窄口牛 发表于 2018-4-24 10:10:38

有道理。

dos时代菜鸟 发表于 2018-4-24 10:26:11

本帖最后由 dos时代菜鸟 于 2018-4-24 10:35 编辑

窄口牛 发表于 2018-4-24 10:10
有道理。
改名

还原

存储 变更记录 的文件 ,新名 与 旧名 不应用逗号 作为间隔符号,因为 逗号可以参与 文件命名,文件名中有逗号 就不好处理了,所以 应该用/这样不能用来 参与命名的 字符 作为 两个文件名 间的隔断。


喝奶的贝贝 发表于 2020-1-15 20:02:02

试试看~~~~~~~~~~~~~
页: [1]
查看完整版本: 求个批量改名的bat