找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 23844|回复: 10

[文件操作] 求一个能对文件批量重名的批处理文件

[复制链接]
发表于 2022-10-26 13:27:10 | 显示全部楼层 |阅读模式
我需要一个能把文件夹中的文件及子文件夹中的文件批量重命名的bat文件。重命名规则为在文件名的每个字符前添加一个@,需要把文件夹里面的文件、文件夹、及子文件都重命名。
之前别人给我写过一个bat,但是只能把第一个文件重命名。各位大神高手们能帮忙把这个bat改为能对文件夹里面的文件、文件夹、及子文件都重命名吗?非常感谢。

下面是只能把第一个文件改名的bat的代码
  1. <# :
  2. cls&echo off&cd /d "%~dp0"&mode con lines=5000
  3. rem 在当前目录里的文件名称的每一个字符前面添加/插入一个指定字符
  4. set #=Any question
  5. title %#% +%$%%$%/%_% %z%
  6. set "self=%~f0"
  7. powershell -NoProfile -ExecutionPolicy bypass "Get-Content -literal '%~f0'|Out-String|Invoke-Expression"
  8. echo;%#% +%$%%$%/%_% %z%
  9. pause
  10. exit
  11. #>
  12. $addword="&";
  13. $self=get-item -literal $env:self;
  14. $current=$self.Directory.FullName;
  15. $files=@(dir -literal $current|?{($self.Name -ne $_.Name) -and ($_ -is [System.IO.FileInfo])});
  16. if($files.length -ge 1){
  17.     $base=[regex]::replace($files[0].BaseName, '\S', {
  18.         param($m);
  19.         return $addword+$m.groups[0].value;
  20.     });
  21.     $newname=$base+$files[0].Extension;
  22.     $newfile=$files[0].Directory.FullName+'\'+$newname;
  23.     write-host ($files[0].FullName.Substring($current.length)+' --> '+$newname);
  24.     move-item -literal $files[0].FullName  $newfile -force -ErrorAction SilentlyContinue;
  25. }
复制代码
发表于 2022-10-26 13:57:00 | 显示全部楼层
本帖最后由 qixiaobin0715 于 2022-10-26 16:21 编辑
  1. for /f "delims=" %%a in ('dir /s /b /a-d') do if not "%%a"==%0 ren "%%a" "@%%~nxa"
复制代码
仔细看了看楼主说明,好像是我理解错误?
 楼主| 发表于 2022-10-26 14:18:51 | 显示全部楼层
本帖最后由 flyflier 于 2022-10-26 14:20 编辑

回复 2# qixiaobin0715


    请问插入到哪一行?我不会编写bat,上面的代码是别人给我的
发表于 2022-10-26 15:43:25 | 显示全部楼层
回复 3# flyflier


    不是插入到哪一行,而是2楼的这单条指令已替代了你1楼中所列示的全部代码。
 楼主| 发表于 2022-10-26 17:33:51 | 显示全部楼层
本帖最后由 flyflier 于 2022-10-26 17:38 编辑

回复 2# qixiaobin0715


使用了二楼的代码,文件名的第一个字符前添加@。   
但是我想表达的意思是下面这样的。另外能否做成对文件夹里面的子文件夹和子文件夹里面的文件生效?

原文件名        转换后文件名(文件名可能会出现英文和中文字符,且每个文件的字符数量同,后缀不变)
123.txt        @1@2@3.txt
456.txt        @4@5@6.txt
789.txt        @7@8@9.txt
发表于 2022-10-26 18:07:50 | 显示全部楼层

  1. @echo off
  2. @rem 保存为ANSI格式
  3. setlocal enabledelayedexpansion
  4. for /f "delims=" %%a in ('dir *.txt /s/b/a-d') do (
  5.         set "str=%%~na"
  6.         set "newName="
  7.         call :renam
  8.         move /y "%%~fa" "%%~dpa!newName!%%~xa"
  9. )
  10. exit /b
  11. :renam
  12. set "newName=%newName%@%str:~0,1%"
  13. set "str=%str:~1%"
  14. if defined str goto :renam
复制代码
 楼主| 发表于 2022-10-26 22:59:20 | 显示全部楼层
回复 6# hfxiang


    非常感谢,问题已经解决。我把第四行的*.txt改为*.*后就能作用于所有后缀的文件了。
发表于 2022-10-26 23:14:28 | 显示全部楼层
本帖最后由 pd1 于 2022-10-26 23:15 编辑

保持为1.bat,因为下面判断了不改自己
  1. <# :
  2. @echo off
  3. powershell -NoProfile -ExecutionPolicy bypass "Get-Content -literal '%~f0' |Out-String|Invoke-Expression"
  4. pause
  5. #>
  6. ls -s|%{if($_.Name -ne "1.bat" -and $_ -is [System.IO.FileInfo]){$newname=$_.BaseName -creplace '(\S)','@$1';ren $_.FullName ($newname+$_.Extension)}}
复制代码
 楼主| 发表于 2022-10-27 10:24:20 | 显示全部楼层
回复 8# pd1


    非常感谢,完美解决。
发表于 2022-10-27 11:16:03 | 显示全部楼层
假设所有文件名的字符数均不超过50个(用代码第6行的数字50表示,可根据情况自行修改),这样应当也行:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%i in ('dir /s /b /a-d') do (
  4.     if not "%%i"==%0 (
  5.         set str=%%~ni
  6.         for /l %%a in (50,-1,1) do if "!str:~%%a!"=="" set n=-%%a
  7.         for /l %%b in (!n!,1,-1) do set str=!str:~,%%b!@!str:~%%b!
  8.         ren "%%i" "!str!%%~xi"
  9.     )
  10. )
  11. pause
复制代码
未经测试,纯属自己练习。代码保存为ANSI编码。
 楼主| 发表于 2022-10-31 11:33:22 | 显示全部楼层
回复 10# qixiaobin0715


    刚才测试了一下,我把第6行的50改为了150,但是实际最长只能支持到111个字符的文件名上限(不含后缀的字符)。网上查了一下Win10支持的最长文件名是255个字符,111的2倍小于255,搞不懂为什么上限是111,不过这个不影响使用。
    这个代码对文件夹和子文件夹中不同后缀文件的批量重命名都没问题,也是完美解决。非常感谢。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-19 13:33 , Processed in 0.020541 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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