用一个批处理文件重新命名递归文件名+文件夹名称
-
23-08-2019 - |
题
我喜欢创建一个批处理文件(操作系统CMD),该递归经过一个选择的文件夹和子文件夹和重命名文件有+文件夹的规则如下:
从所有文件+文件夹名称,所有大写+小写“V”和“W”的字母需要与字母“Y”和“Z”来代替。
e.g。 11V0W必须成为11Y0Z。
我相信它可以用FOR / R但如何? 我觉得这里需要一个子程序调用,除了用FOR / R基本递归通过一个检查每个字母一个。
解决方案
下面的批处理执行此至少在文件名。目录是有点麻烦(至少我不能拿出一个非无限溶液到目前为止):
@echo off
setlocal enableextensions
for /r %%f in (*) do call :process "%%f"
endlocal
goto :eof
:process
pushd "%~dp1"
set fn=%~nx1
set fn=%fn:V=Y%
set fn=%fn:W=Z%
ren "%~nx1" "%fn%"
popd
goto :eof
但理论上它不应该是太难钉目录重命名到该
其他提示
汤姆,与以前的剧本我张贴摆弄周围,这里是一个处理所有文件和子目录:
<强> recurename.cmd 强> 目录
@echo off
setlocal ENABLEDELAYEDEXPANSION
set Replaces="V=Y" "W=Z" "m=A"
set StartDir=%~dp1
call :RenameDirs "%StartDir:~0,-1%"
exit /b 0
:RenameDirs
call :RenameFiles "%~1"
for /f "delims=" %%d in ('dir /ad /b "%~1"2^>nul') do call :RenameDirs "%~1\%%~d"
if "%~1"=="%StartDir:~0,-1%" exit /b 0
set _pos=0
set _dir=%~f1
set _dir_orig=!_dir!
:finddirName
set /a _pos-=1
call set _dir_pos=!!!_dir:~%_pos%,1!!!
if not "%_dir_pos%"=="\" goto finddirName
call set _origines=!!!_dir:~0,%_pos%!!!
set /a _pos+=1
call set _dir=!!!_dir:~%_pos%!!!
for %%r in (%Replaces%) do call set _dir=!!!_dir:%%~r!!!
if /i not "!_dir!"=="!_dir_orig!" echo move "%~1" "%_origines%\!_dir!"
exit /b 0
:RenameFiles
for /f "delims=" %%f in ('dir /a-d /b "%~1"2^>nul') do (
set _file=%%~nf
set _file_orig=!_file!
for %%r in (%Replaces%) do call set _file=!!!_file:%%~r!!!
if /i not "!_file!"=="!_file_orig!" echo ren "%~1\%%f" "%~1\!_file!%%~xf"
)
exit /b 0
<强> ___注释____ 强>结果 这是一个非破坏性的脚本,取出的回声以重命名任何文件/目录强>从正确的命令。 (的回波移动和<强>回声仁强>)
设置替代对象= 设置此变量可以任何对你需要改变。
设置STARTDIR = 强>我想确保,不知何故,参数和从它仅取的路径。如果一个文件被作为参数,整个容器目录和子目录将被处理。
如果 “%〜1” == “%STARTDIR:〜0,-1%” 退出/ B 0::该线被放置到从正在处理停止参数目录本身。如果你愿意的话,删除此行。结果 如果脚本调用,比如, C:\ TEMP \ ,删除这条线将名称更改为 C:\ TEAP \ 到底
与该目录树:
.
├── 00v0w
│ ├── 12V0W
│ ├── 12d0w
│ └── 12v0d
├── 11V0W
├── 11d0w
└── 11v0d
这些更名命令:
$ renamer --regex --find '[vV]' --replace 'Y' '**'
$ renamer --regex --find '[wW]' --replace 'Z' '**'
会产生这样的输出:
.
├── 00Y0Z
│ ├── 12Y0Z
│ ├── 12Y0d
│ └── 12d0Z
├── 11Y0Z
├── 11Y0d
└── 11d0Z
不隶属于 StackOverflow