[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

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

我需要一个能把文件夹中的文件及子文件夹中的文件批量重命名的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. }
复制代码

回复 10# qixiaobin0715


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

TOP

假设所有文件名的字符数均不超过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编码。

TOP

回复 8# pd1


    非常感谢,完美解决。

TOP

本帖最后由 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)}}
复制代码

TOP

回复 6# hfxiang


    非常感谢,问题已经解决。我把第四行的*.txt改为*.*后就能作用于所有后缀的文件了。

TOP

  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
复制代码

TOP

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

TOP

回复 3# flyflier


    不是插入到哪一行,而是2楼的这单条指令已替代了你1楼中所列示的全部代码。

TOP

本帖最后由 flyflier 于 2022-10-26 14:20 编辑

回复 2# qixiaobin0715


    请问插入到哪一行?我不会编写bat,上面的代码是别人给我的

TOP

本帖最后由 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"
复制代码
仔细看了看楼主说明,好像是我理解错误?

TOP

返回列表