标题: [文件操作] 求一个能对文件批量重名的批处理文件 [打印本页]
作者: flyflier 时间: 2022-10-26 13:27 标题: 求一个能对文件批量重名的批处理文件
我需要一个能把文件夹中的文件及子文件夹中的文件批量重命名的bat文件。重命名规则为在文件名的每个字符前添加一个@,需要把文件夹里面的文件、文件夹、及子文件都重命名。
之前别人给我写过一个bat,但是只能把第一个文件重命名。各位大神高手们能帮忙把这个bat改为能对文件夹里面的文件、文件夹、及子文件都重命名吗?非常感谢。
下面是只能把第一个文件改名的bat的代码- <# :
- cls&echo off&cd /d "%~dp0"&mode con lines=5000
- rem 在当前目录里的文件名称的每一个字符前面添加/插入一个指定字符
- set #=Any question
- title %#% +%$%%$%/%_% %z%
- set "self=%~f0"
- powershell -NoProfile -ExecutionPolicy bypass "Get-Content -literal '%~f0'|Out-String|Invoke-Expression"
- echo;%#% +%$%%$%/%_% %z%
- pause
- exit
- #>
- $addword="&";
- $self=get-item -literal $env:self;
- $current=$self.Directory.FullName;
- $files=@(dir -literal $current|?{($self.Name -ne $_.Name) -and ($_ -is [System.IO.FileInfo])});
- if($files.length -ge 1){
- $base=[regex]::replace($files[0].BaseName, '\S', {
- param($m);
- return $addword+$m.groups[0].value;
- });
- $newname=$base+$files[0].Extension;
- $newfile=$files[0].Directory.FullName+'\'+$newname;
- write-host ($files[0].FullName.Substring($current.length)+' --> '+$newname);
- move-item -literal $files[0].FullName $newfile -force -ErrorAction SilentlyContinue;
- }
复制代码
作者: qixiaobin0715 时间: 2022-10-26 13:57
本帖最后由 qixiaobin0715 于 2022-10-26 16:21 编辑
- for /f "delims=" %%a in ('dir /s /b /a-d') do if not "%%a"==%0 ren "%%a" "@%%~nxa"
复制代码
仔细看了看楼主说明,好像是我理解错误?
作者: flyflier 时间: 2022-10-26 14:18
本帖最后由 flyflier 于 2022-10-26 14:20 编辑
回复 2# qixiaobin0715
请问插入到哪一行?我不会编写bat,上面的代码是别人给我的
作者: hfxiang 时间: 2022-10-26 15:43
回复 3# flyflier
不是插入到哪一行,而是2楼的这单条指令已替代了你1楼中所列示的全部代码。
作者: flyflier 时间: 2022-10-26 17:33
本帖最后由 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
作者: hfxiang 时间: 2022-10-26 18:07
- @echo off
- @rem 保存为ANSI格式
- setlocal enabledelayedexpansion
- for /f "delims=" %%a in ('dir *.txt /s/b/a-d') do (
- set "str=%%~na"
- set "newName="
- call :renam
- move /y "%%~fa" "%%~dpa!newName!%%~xa"
- )
- exit /b
- :renam
- set "newName=%newName%@%str:~0,1%"
- set "str=%str:~1%"
- if defined str goto :renam
复制代码
作者: flyflier 时间: 2022-10-26 22:59
回复 6# hfxiang
非常感谢,问题已经解决。我把第四行的*.txt改为*.*后就能作用于所有后缀的文件了。
作者: pd1 时间: 2022-10-26 23:14
本帖最后由 pd1 于 2022-10-26 23:15 编辑
保持为1.bat,因为下面判断了不改自己- <# :
- @echo off
- powershell -NoProfile -ExecutionPolicy bypass "Get-Content -literal '%~f0' |Out-String|Invoke-Expression"
- pause
- #>
- ls -s|%{if($_.Name -ne "1.bat" -and $_ -is [System.IO.FileInfo]){$newname=$_.BaseName -creplace '(\S)','@$1';ren $_.FullName ($newname+$_.Extension)}}
复制代码
作者: flyflier 时间: 2022-10-27 10:24
回复 8# pd1
非常感谢,完美解决。
作者: qixiaobin0715 时间: 2022-10-27 11:16
假设所有文件名的字符数均不超过50个(用代码第6行的数字50表示,可根据情况自行修改),这样应当也行:- @echo off
- setlocal enabledelayedexpansion
- for /f "delims=" %%i in ('dir /s /b /a-d') do (
- if not "%%i"==%0 (
- set str=%%~ni
- for /l %%a in (50,-1,1) do if "!str:~%%a!"=="" set n=-%%a
- for /l %%b in (!n!,1,-1) do set str=!str:~,%%b!@!str:~%%b!
- ren "%%i" "!str!%%~xi"
- )
- )
- pause
复制代码
未经测试,纯属自己练习。代码保存为ANSI编码。
作者: flyflier 时间: 2022-10-31 11:33
回复 10# qixiaobin0715
刚才测试了一下,我把第6行的50改为了150,但是实际最长只能支持到111个字符的文件名上限(不含后缀的字符)。网上查了一下Win10支持的最长文件名是255个字符,111的2倍小于255,搞不懂为什么上限是111,不过这个不影响使用。
这个代码对文件夹和子文件夹中不同后缀文件的批量重命名都没问题,也是完美解决。非常感谢。
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |