Board logo

标题: [文件操作] 虚心向各位大佬求请一个文件名重命名的批处理 [打印本页]

作者: wocool    时间: 2021-9-18 14:42     标题: 虚心向各位大佬求请一个文件名重命名的批处理

目的:在原始文件名中每隔一个字符就插入一个自定义字符。
例如:都插入自定义字符”飞“
abcdefg.aaa           a飞b飞c飞d飞e飞f飞g飞.aaa
1234567890.bbb    1飞2飞3飞4飞5飞6飞7飞8飞9飞0飞.bbb
重命名后使之成为这样的形式。
谢谢大佬们!感激不尽!
作者: qixiaobin0715    时间: 2021-9-18 16:07

本帖最后由 qixiaobin0715 于 2021-9-18 16:11 编辑

回复 1# wocool
简单点,可以使用下面代码,但应注意以下事项:
1.假设目标文件夹是D:\abc;
2.批处理文件不要放在目标文件夹中,否则也会被改名;
3.for /l括号中终值可根据情况调整,这里取50,不能小于改名后的文件名的字符数。
  1. @echo off
  2. cd D:\abc
  3. setlocal enabledelayedexpansion
  4. for %%a in (*) do (
  5. set str=%%~na
  6. for /l %%i in (1,2,50) do if not "!str:~%%i!"=="" set str=!str:~0,%%i!飞!str:~%%i!
  7. ren "%%a" "!str!飞%%~xa"
  8. )
  9. pause
复制代码

作者: Batcher    时间: 2021-9-18 16:12

回复 1# wocool
  1. @echo off
  2. cd /d "%~dp0"
  3. for /f "delims=" %%i in ('dir /b /a-d *.txt') do (
  4.     echo Change name for file: %%i
  5.     for /f "delims=" %%j in ('powershell -c "'%%~ni'.ToCharArray() -join '飞'" 2^>nul') do (
  6.         ren "%%i" "%%j%%~xi"
  7.     )
  8. )
复制代码

作者: wocool    时间: 2021-9-18 16:22

非常感谢两位大佬帮助,晚上回家马上试用。拜谢啦!
作者: wocool    时间: 2021-9-18 17:27

回复 2# qixiaobin0715


    qixiaobin0715大佬您好,我双击运行你的批处理没有反应,cmd运行有如图说明再次请您帮忙看看!

作者: wocool    时间: 2021-9-18 17:31

本帖最后由 wocool 于 2021-9-18 17:34 编辑

回复 3# Batcher


    Batcher大佬您好,运行您的批处理后文件没有重命名,还请您帮忙看看,而且运行几次好像只能处理如图那几个文件。

作者: Fit    时间: 2021-9-18 21:12

@echo off&setlocal enabledelayedexpansion
set my=%~nx0

for /f %%i in ('dir /b /a-d') do (
if not "%%i"=="%my%" (
call:StrLen %%~ni
echo ren %%i !name!%%~xi)
)

pause

:StrLen
set /a len=0
set str=%1
set name=
for /l %%i in (0,1,50) do (
if not "!str:~%%i,1!"=="" (
set name=!name!!str:~%%i,1!飞
set /a len+=1)else (goto:eof)
)
作者: Batcher    时间: 2021-9-18 21:37

回复 5# wocool


请参考Q-01观察一下哪行代码在报错以及详细的报错信息:
https://mp.weixin.qq.com/s/6lbb97qUOs1sTyKJfN0ZEQ
作者: wocool    时间: 2021-9-18 23:35

回复 8# Batcher


    谢谢大佬耐心指点,萌新按照您的提示操作后发现,可以进行部分文件的重命名,但是能重命名的文件都是扩展名是”txt“的文本文档文件,其他文件没有作用。
执行”test.bat"后回显如下:

Z:\0>test.bat

Z:\0>cd /d "Z:\0\"

Z:\0>for /F "delims=" %i in ('dir /b /a-d *.txt') do (
echo Change name for file: %i
for /F "delims=" %j in ('powershell -c "'%~ni'.ToCharArray() -join '飞'" 2>nul') do (ren "%i" "%j%~xi" )
)

Z:\0>(
echo Change name for file: 0008.txt
for /F "delims=" %j in ('powershell -c "'0008'.ToCharArray() -join '飞'" 2>nul') do (ren "0008.txt" "%j.txt" )
)
Change name for file: 0008.txt

Z:\0>(ren "0008.txt" "0飞0飞0飞8.txt" )

Z:\0>(
echo Change name for file: 1.txt
for /F "delims=" %j in ('powershell -c "'1'.ToCharArray() -join '飞'" 2>nul') do (ren "1.txt" "%j.txt" )
)
Change name for file: 1.txt

Z:\0>(ren "1.txt" "1.txt" )

Z:\0>(
echo Change name for file: 11.txt
for /F "delims=" %j in ('powershell -c "'11'.ToCharArray() -join '飞'" 2>nul') do (ren "11.txt" "%j.txt" )
)
Change name for file: 11.txt

Z:\0>(ren "11.txt" "1飞1.txt" )

Z:\0>(
echo Change name for file: 新建文本文档.txt
for /F "delims=" %j in ('powershell -c "'新建文本文档'.ToCharArray() -join '飞'" 2>nul') do (ren "新建文本文档.txt" "%j.txt" )
)
Change name for file: 新建文本文档.txt

Z:\0>(ren "新建文本文档.txt" "新飞建飞文飞本飞文飞档.txt" )

Z:\0>

然后,此时需要更改文件名的所属文件夹如下图:

请您明示,跪谢!!!
作者: wocool    时间: 2021-9-18 23:43

本帖最后由 wocool 于 2021-9-18 23:45 编辑

回复 7# Fit


    大佬您好,按照查错方法我也把您这运行回显报给您,帮忙看看!问题就是并没用重命名发生。
执行后如下:
  1. Z:\111>test.bat
  2. Z:\111>setlocal enabledelayedexpansion
  3. Z:\111>set my=test.bat
  4. Z:\111>for /F %i in ('dir /b /a-d') do (if not "%i" == "test.bat" (
  5. call:StrLen %~ni
  6. echo ren %i !name!%~xi
  7. ) )
  8. Z:\111>(if not "123.123" == "test.bat" (
  9. call:StrLen 123
  10. echo ren 123.123 !name!.123
  11. ) )
  12. Z:\111>set /a len=0
  13. Z:\111>set str=123
  14. Z:\111>set name=
  15. Z:\111>for /L %i in (0 1 50) do (if not "!str:~%i,1!" == "" (
  16. set name=!name!!str:~%i,1!飞
  17. set /a len+=1
  18. )  else (goto:eof) )
  19. Z:\111>(if not "!str:~0,1!" == "" (
  20. set name=!name!!str:~0,1!飞
  21. set /a len+=1
  22. )  else (goto:eof) )
  23. Z:\111>(if not "!str:~1,1!" == "" (
  24. set name=!name!!str:~1,1!飞
  25. set /a len+=1
  26. )  else (goto:eof) )
  27. Z:\111>(if not "!str:~2,1!" == "" (
  28. set name=!name!!str:~2,1!飞
  29. set /a len+=1
  30. )  else (goto:eof) )
  31. Z:\111>(if not "!str:~3,1!" == "" (
  32. set name=!name!!str:~3,1!飞
  33. set /a len+=1
  34. )  else (goto:eof) )
  35. Z:\111>(if not "!str:~4,1!" == "" (
  36. set name=!name!!str:~4,1!飞
  37. set /a len+=1
  38. )  else (goto:eof) )
  39. Z:\111>(if not "!str:~5,1!" == "" (
  40. set name=!name!!str:~5,1!飞
  41. set /a len+=1
  42. )  else (goto:eof) )
  43. Z:\111>(if not "!str:~6,1!" == "" (
  44. set name=!name!!str:~6,1!飞
  45. set /a len+=1
  46. )  else (goto:eof) )
  47. Z:\111>(if not "!str:~7,1!" == "" (
  48. set name=!name!!str:~7,1!飞
  49. set /a len+=1
  50. )  else (goto:eof) )
  51. Z:\111>(if not "!str:~8,1!" == "" (
  52. set name=!name!!str:~8,1!飞
  53. set /a len+=1
  54. )  else (goto:eof) )
  55. Z:\111>(if not "!str:~9,1!" == "" (
  56. set name=!name!!str:~9,1!飞
  57. set /a len+=1
  58. )  else (goto:eof) )
  59. Z:\111>(if not "!str:~10,1!" == "" (
  60. set name=!name!!str:~10,1!飞
  61. set /a len+=1
  62. )  else (goto:eof) )
  63. Z:\111>(if not "!str:~11,1!" == "" (
  64. set name=!name!!str:~11,1!飞
  65. set /a len+=1
  66. )  else (goto:eof) )
  67. Z:\111>(if not "!str:~12,1!" == "" (
  68. set name=!name!!str:~12,1!飞
  69. set /a len+=1
  70. )  else (goto:eof) )
  71. Z:\111>(if not "!str:~13,1!" == "" (
  72. set name=!name!!str:~13,1!飞
  73. set /a len+=1
  74. )  else (goto:eof) )
  75. Z:\111>(if not "!str:~14,
复制代码
回显过长无法完全显示实在抱歉!!

作者: qixiaobin0715    时间: 2021-9-19 07:16

回复 5# wocool
既然把批处理文件放在了Z:\下,那么可以将代码第2行修改为:cd /d Z:\0
主要是为了指向需要改名的文件所在的文件夹。
运行批处理文件试试看还有什么问题。
作者: yd_wangqing    时间: 2021-9-19 09:26

@echo off & setlocal enabledelayedexpansion &chcp 65001
cd /d %~dp0
for %%i in (*.*) do (
  set file_name=%%~ni
  call :begin !file_name!
  echo %%~nxi
  rename %%~nxi  !file_new_value2!%%~xi
)
echo "执行完成。。。"
pause
:begin
set /a num=0
set "file_value=%1"
:loop
if "!file_value:~%num%,1!" equ "" (
goto :eof
)
set "file_new_value=!file_value:~%num%,1!"
if %num% == 0 (
set file_new_value2=!file_new_value!飞
) ^
else (
set file_new_value2=!file_new_value2!!file_new_value!飞
)
set /a num=num+1
goto :loop
作者: wocool    时间: 2021-9-19 11:07

回复 11# qixiaobin0715


    感谢大佬提示,确实是把路径哪里改写错了,导致批处理出错,更正后可以达到我希望的重命名目的。索性把路径出代码去除啦,然后把最后一个字符也除去啦,这样您的批处理就无法重命名文件名是1个字符的文件啦,再把您这批处理命名成1个字符的名字后“扔”在待处理的文件夹中就不会把自己给重命名了,可以“重复使用”哈哈哈哈。
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for %%a in (*) do (
  4. set str=%%~na
  5. for /l %%i in (1,2,200) do if not "!str:~%%i!"=="" set str=!str:~0,%%i!飞!str:~%%i!
  6. ren "%%a" "!str!%%~xa"
  7. )
复制代码
这是根据实际情况我自己调整的,望大佬理解!再次感谢您的帮助!!
作者: wocool    时间: 2021-9-19 11:12

回复 12# yd_wangqing


    感谢yd_wangqing大佬您的热心帮助!之前在qixiaobin0715大佬的帮助下已经完成了期望目标,但是还是要谢谢您!我们这里不但人人都有高超的技术而且人人都有一颗无私的爱心!真好。谢谢大家啦!
作者: wocool    时间: 2021-9-19 11:14

本帖最后由 wocool 于 2021-9-19 11:15 编辑

网络出错,重复发帖啦,抱歉!
作者: qixiaobin0715    时间: 2021-9-20 14:35

回复 13# wocool
欢迎修改代码,只要能解决问题就好。
作者: cmd1152    时间: 2021-9-20 21:49

回复 3# Batcher


    开回显的输出,E盘测试
C:\ _
C:\Windows\system32\cmd.exe

-  □  ×

Microsoft Windows [版本 10.0.17134.285]
(c) 2018 Microsoft Corporation。保留所有权利。

E:\>cd /d "E:\"

E:\>for /F "delims=" %i in ('dir /b /a-d *.txt') do (
echo Change name for file: %i
for /F "delims=" %j in ('powershell -c "'%~ni'.ToCharArray() -join '飞'" 2>nul') do (ren "%i" "%j%~xi" )
)

E:\>(
echo Change name for file: 0008.txt
for /F "delims=" %j in ('powershell -c "'0008'.ToCharArray() -join '飞'" 2>nul') do (ren "0008.txt" "%j.txt" )
)
Change name for file: 0008.txt

E:\>(ren "0008.txt" "0飞0飞0飞8.txt" )

E:\>(
echo Change name for file: 1.txt
for /F "delims=" %j in ('powershell -c "'1'.ToCharArray() -join '飞'" 2>nul') do (ren "1.txt" "%j.txt" )
)
Change name for file: 1.txt

E:\>(ren "1.txt" "1.txt" )

E:\>(
echo Change name for file: 11.txt
for /F "delims=" %j in ('powershell -c "'11'.ToCharArray() -join '飞'" 2>nul') do (ren "11.txt" "%j.txt" )
)
Change name for file: 11.txt

E:\>(ren "11.txt" "1飞1.txt" )

E:\>(
echo Change name for file: 新建文本文档.txt
for /F "delims=" %j in ('powershell -c "'新建文本文档'.ToCharArray() -join '飞'" 2>nul') do (ren "新建文本文档.txt" "%j.txt" )
)
Change name for file: 新建文本文档.txt

E:\>(ren "新建文本文档.txt" "新飞建飞文飞本飞文飞档.txt" )

E:\>





欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2