标题: [文件操作] 虚心向各位大佬求请一个文件名重命名的批处理 [打印本页]
作者: 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,不能小于改名后的文件名的字符数。- @echo off
- cd D:\abc
- setlocal enabledelayedexpansion
- for %%a in (*) do (
- set str=%%~na
- for /l %%i in (1,2,50) do if not "!str:~%%i!"=="" set str=!str:~0,%%i!飞!str:~%%i!
- ren "%%a" "!str!飞%%~xa"
- )
- pause
复制代码
作者: Batcher 时间: 2021-9-18 16:12
回复 1# wocool - @echo off
- cd /d "%~dp0"
- 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"
- )
- )
复制代码
作者: 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
大佬您好,按照查错方法我也把您这运行回显报给您,帮忙看看!问题就是并没用重命名发生。
执行后如下:- Z:\111>test.bat
-
- Z:\111>setlocal enabledelayedexpansion
-
- Z:\111>set my=test.bat
-
- Z:\111>for /F %i in ('dir /b /a-d') do (if not "%i" == "test.bat" (
- call:StrLen %~ni
- echo ren %i !name!%~xi
- ) )
-
- Z:\111>(if not "123.123" == "test.bat" (
- call:StrLen 123
- echo ren 123.123 !name!.123
- ) )
-
- Z:\111>set /a len=0
-
- Z:\111>set str=123
-
- Z:\111>set name=
-
- Z:\111>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) )
-
- Z:\111>(if not "!str:~0,1!" == "" (
- set name=!name!!str:~0,1!飞
- set /a len+=1
- ) else (goto:eof) )
-
- Z:\111>(if not "!str:~1,1!" == "" (
- set name=!name!!str:~1,1!飞
- set /a len+=1
- ) else (goto:eof) )
-
- Z:\111>(if not "!str:~2,1!" == "" (
- set name=!name!!str:~2,1!飞
- set /a len+=1
- ) else (goto:eof) )
-
- Z:\111>(if not "!str:~3,1!" == "" (
- set name=!name!!str:~3,1!飞
- set /a len+=1
- ) else (goto:eof) )
-
- Z:\111>(if not "!str:~4,1!" == "" (
- set name=!name!!str:~4,1!飞
- set /a len+=1
- ) else (goto:eof) )
-
- Z:\111>(if not "!str:~5,1!" == "" (
- set name=!name!!str:~5,1!飞
- set /a len+=1
- ) else (goto:eof) )
-
- Z:\111>(if not "!str:~6,1!" == "" (
- set name=!name!!str:~6,1!飞
- set /a len+=1
- ) else (goto:eof) )
-
- Z:\111>(if not "!str:~7,1!" == "" (
- set name=!name!!str:~7,1!飞
- set /a len+=1
- ) else (goto:eof) )
-
- Z:\111>(if not "!str:~8,1!" == "" (
- set name=!name!!str:~8,1!飞
- set /a len+=1
- ) else (goto:eof) )
-
- Z:\111>(if not "!str:~9,1!" == "" (
- set name=!name!!str:~9,1!飞
- set /a len+=1
- ) else (goto:eof) )
-
- Z:\111>(if not "!str:~10,1!" == "" (
- set name=!name!!str:~10,1!飞
- set /a len+=1
- ) else (goto:eof) )
-
- Z:\111>(if not "!str:~11,1!" == "" (
- set name=!name!!str:~11,1!飞
- set /a len+=1
- ) else (goto:eof) )
-
- Z:\111>(if not "!str:~12,1!" == "" (
- set name=!name!!str:~12,1!飞
- set /a len+=1
- ) else (goto:eof) )
-
- Z:\111>(if not "!str:~13,1!" == "" (
- set name=!name!!str:~13,1!飞
- set /a len+=1
- ) else (goto:eof) )
-
- 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个字符的名字后“扔”在待处理的文件夹中就不会把自己给重命名了,可以“重复使用”哈哈哈哈。- @echo off
- setlocal enabledelayedexpansion
- for %%a in (*) do (
- set str=%%~na
- for /l %%i in (1,2,200) do if not "!str:~%%i!"=="" set str=!str:~0,%%i!飞!str:~%%i!
- ren "%%a" "!str!%%~xa"
- )
复制代码
这是根据实际情况我自己调整的,望大佬理解!再次感谢您的帮助!!
作者: 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:\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 |