批处理:如何在大写字母上拆分字符串
Batch: how to split string on uppercase letter
我有一个目录结构,其中包含以用户全名 (ForenameSurname) 命名的主目录,例如:
/user/JohnDoe
/user/JaneDoe
/user/MobyDick
现在我想复制整个结构,将 ForenameSurname 更改为“'first two letters of first name'+'surname'”,结果:
/user/JoDoe
/user/JaDoe
/user/MoDick
我知道如何获取子字符串 (~n),但如何在第一个大写字母处拆分字符串?完全可以使用纯批处理吗?
试试这个:
@echo off
setlocal EnableDelayedExpansion
set "upcaseLetters=ABCDEFGHIJKLMNOPQRSTUVWXYZ"
cd \user
for /D %%a in (*) do (
call :convert name=%%a
echo New name: !name!
)
goto :EOF
:convert
set "var=%2"
:nextChar
set "char=%var:~2,1%"
if "!upcaseLetters:%char%=%char%!" equ "%upcaseLetters%" goto end
set "var=%var:~0,2%%var:~3%"
goto nextChar
:end
set "%1=%var%"
exit /B
@echo off
setlocal enableextensions enabledelayedexpansion
set "root=%cd%\users"
for /d %%f in ( "%root%\*" ) do (
set "name=%%~nxf"
for /f %%a in ("!name:~0,2!"
) do for /f "tokens=* delims=abcdefghijklmnopqrstuvwxyz" %%b in ("!name:~2!"
) do if not "%%~nxf"=="%%~a%%~b" if not exist "%root%\%%~a%%~b" (
echo ren "%%~ff" "%%~a%%~b"
) else (
echo "%%~nxf" can not be renamed to "%%~a%%~b"
)
)
重命名操作仅回显到控制台。如果输出正确,请删除 ren
命令前缀的 echo
。
我会使用我的 JREN.BAT regular expression rename utility - 一个混合 JScript/batch 脚本,可以在任何 Windows XP 以后的机器上本地运行。
jren "^([A-Z][a-z])[a-z]*(?=[A-Z])" /d /t /p c:\users
/T
选项是测试模式,意味着它只显示建议的重命名结果。删除 /T
选项以实际重命名文件夹。
我有一个目录结构,其中包含以用户全名 (ForenameSurname) 命名的主目录,例如:
/user/JohnDoe
/user/JaneDoe
/user/MobyDick
现在我想复制整个结构,将 ForenameSurname 更改为“'first two letters of first name'+'surname'”,结果:
/user/JoDoe
/user/JaDoe
/user/MoDick
我知道如何获取子字符串 (~n),但如何在第一个大写字母处拆分字符串?完全可以使用纯批处理吗?
试试这个:
@echo off
setlocal EnableDelayedExpansion
set "upcaseLetters=ABCDEFGHIJKLMNOPQRSTUVWXYZ"
cd \user
for /D %%a in (*) do (
call :convert name=%%a
echo New name: !name!
)
goto :EOF
:convert
set "var=%2"
:nextChar
set "char=%var:~2,1%"
if "!upcaseLetters:%char%=%char%!" equ "%upcaseLetters%" goto end
set "var=%var:~0,2%%var:~3%"
goto nextChar
:end
set "%1=%var%"
exit /B
@echo off
setlocal enableextensions enabledelayedexpansion
set "root=%cd%\users"
for /d %%f in ( "%root%\*" ) do (
set "name=%%~nxf"
for /f %%a in ("!name:~0,2!"
) do for /f "tokens=* delims=abcdefghijklmnopqrstuvwxyz" %%b in ("!name:~2!"
) do if not "%%~nxf"=="%%~a%%~b" if not exist "%root%\%%~a%%~b" (
echo ren "%%~ff" "%%~a%%~b"
) else (
echo "%%~nxf" can not be renamed to "%%~a%%~b"
)
)
重命名操作仅回显到控制台。如果输出正确,请删除 ren
命令前缀的 echo
。
我会使用我的 JREN.BAT regular expression rename utility - 一个混合 JScript/batch 脚本,可以在任何 Windows XP 以后的机器上本地运行。
jren "^([A-Z][a-z])[a-z]*(?=[A-Z])" /d /t /p c:\users
/T
选项是测试模式,意味着它只显示建议的重命名结果。删除 /T
选项以实际重命名文件夹。