找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
楼主: 随风

批处理将字符串中的字母大小写互换

[复制链接]
发表于 2009-11-14 18:26:27 | 显示全部楼层

回复 25楼 zqz0012005 的帖子

嗯,没必要将大小写字母定义在两个变量中。
  1. @echo off
  2. set "letters= abcdefghijklmnopqrstuvwxyzZYXWVUTSRQPONMLKJIHGFEDCBA"
  3. for /l %%a in (1,1,26) do call set /a "_%%letters:~%%a,1%%=%%a"
  4. :input
  5. setlocal EnableDelayedExpansion
  6. echo 请输入:&set /p var=&if not defined var endlocal&goto:input
  7. :loop
  8. set char=!var:~%pi%,1!
  9. set /a sn=_!char! 2>nul||set sn=0
  10. if defined char (
  11.     if %sn% gtr 0 (
  12.         if "!char!"=="!letters:~%sn%,1!" (set str=!str!!letters:~-%sn%,1!) else (set str=!str!!letters:~%sn%,1!)
  13.     ) else (
  14.         set str=!str!!char!
  15.     )
  16.     set /a pi+=1
  17.     goto loop
  18. )
  19. echo=!str!
  20. pause&endlocal&goto input
复制代码
发表于 2009-11-14 18:31:01 | 显示全部楼层
支持各种特殊情况
包括:
  1. ^ < > " ; ^ & * = :~ |
复制代码
等符号
  1. @echo off&setlocal enabledelayedexpansion
  2. for %%a in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) do set @D%%a=%%a
  3. for %%a in (a b c d e f g h i j k l m n o p q r s t u v w x y z) do set @x%%a=%%a
  4. set /p in=输入一个大小写都的有字符串:
  5. set n=0
  6. set out=
  7. for /l %%a in (0) do (
  8. for %%n in (!n!) do (
  9.   for /f "delims=" %%b in ("!in:~%%n,1!") do (
  10.    if defined @d%%b (
  11.     if %%b equ !@D%%b! (set out=!out!!@x%%b!) else (set out=!out!!@D%%b!)
  12.    ) else (
  13.     set out=!out!^^%%b
  14.    )
  15.   set /a n+=1
  16.   )
  17.   if "!in:~%%n,1!" equ ";" set out=!out!;&set/a n+=1
  18.   if %%n equ !n! echo;大小写互换为:!out!&PAUSE&exit
  19. )
  20. )
复制代码

[ 本帖最后由 netbenton 于 2009-11-14 19:32 编辑 ]
发表于 2009-11-14 18:48:23 | 显示全部楼层
不要忘了 for /f 的 eol 隐患,呵呵。

for /l 无限循环由于运行机制,其实不太实用。必须用 exit 强制退出整个bat,exit /b 或 goto 都不行。
发表于 2009-11-14 19:29:17 | 显示全部楼层
re zqz0012005
48楼又经修改,增加了以下特殊符号的处理:
^ ; !

效率可是很高的了
确实是只有exit强行退出,还没想到其它办法来做到一个预处理全部完成的,只好用它了。
发表于 2009-11-15 14:14:21 | 显示全部楼层
試一試...
@echo off&setlocal enabledelayedexpansion&set nub=0
set "s=a b c d e f g h i j k l m n o p q r s t u v w x y z"
set "b=A B C D E F G H I J K L M N O P Q R S T U V W X Y Z"
for %%i in (!s!) do set/a num+=1&set %%i1=%%i
for %%i in (!b!) do set/a num2+=1&set %%i2=%%i
set /p "str=string= *"
:lp
call set str=%%str:~!nub!%%
for %%i in (!b!) do if "!str:~0,1!"=="%%i" call set "OK=!OK!%%!str:~0,1!1%%"&goto ut
for %%i in (!s!) do if "!str:~0,1!"=="%%i" call set "OK=!OK!%%!str:~0,1!2%%"&goto :out
if not "!str!"=="" (set "ok=!ok!!str:~0,1!") else (goto :end)
:out
set nub=1
goto :lp
:end
echo string= *!OK!
pause>nul
发表于 2011-7-15 11:23:09 | 显示全部楼层
本帖最后由 zm900612 于 2011-7-15 11:26 编辑

用 choice 的思路,不通用、不高效、不简洁、不考虑字符的兼容性:
  1. aAcebFaJad
  2. cls
  3. @echo off&setlocal enabledelayedexpansion
  4. set str=#ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890
  5. set /p 字符串=<%0
  6. set 字
  7. call :strlen 字符串
  8. (for /l %%a in (1 1 !len!) do (
  9. choice /cs /c abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890 /n>nul
  10. for %%b in (!errorlevel!) do set 结 果 =!结 果 !!str:~%%b,1!
  11. ))<%0
  12. set 结
  13. pause

  14. :strlen
  15. setlocal enabledelayedexpansion
  16. set "$=!%1!#"
  17. set len=&for %%a in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1)do if !$:~%%a^,1!. NEQ . set/a len+=%%a&set $=!$:~%%a!
  18. endlocal&If %2. neq . (set/a%2=%len%)else set len=%len%
复制代码
发表于 2011-7-15 11:48:12 | 显示全部楼层
vbs:

  1. Dim inpStr, Arr, Str
  2. inpStr = InputBox("请输入要转换的字符串")
  3. Arr = split("a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z", ",")
  4. For Each Str In Arr
  5.   inpStr = Replace(inpStr, Str,"@#$&")
  6.   inpStr = Replace(inpStr, UCase(Str), Str)
  7.   inpStr = Replace(inpStr, "@#$&", UCase(str))
  8. Next
  9. MsgBox inpStr
复制代码
发表于 2011-7-15 12:07:12 | 显示全部楼层
本帖最后由 zm900612 于 2011-7-15 12:47 编辑

另一种逐字替换,兼容各种可见的特殊字符,调用 ascmap 后可以支持汉字:
  1. @echo off
  2. set "字符串=WwW.baThOME.net"
  3. set 字
  4. setlocal enabledelayedexpansion
  5. set<nul>tmp /p=@!字符串!
  6. (for %%a in (tmp) do (
  7.         for /l %%b in (1 2 %%~za) do echo;
  8. ))>k

  9. set str=@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@!"#$%%&'()*+,-./0123456789:;<=>?@abcdefghijklmnopqrstuvwxyz[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~
  10. for /f "skip=2 tokens=1,3" %%a in ('fc /b k tmp') do if "%%a" lss "1" set 结 果 =!结 果 !!str:~0x%%b,1!

  11. set 结
  12. del tmp k
  13. pause
复制代码
发表于 2011-7-15 15:38:41 | 显示全部楼层
本帖最后由 mxxcgzxxx 于 2011-7-15 16:03 编辑

没事来个好玩的
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set str=aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ
  4. :1
  5. set/p p=
  6. echo %p%|findstr "--[a-Z]--">nul&&echo 大哥没事写神马多减号嘛!重写! && ghoto :1
  7. set a=26
  8. :2
  9. set /a a-=1
  10. set b=!str:~%a%,1!
  11. set "p=!p:%b%=--%b%--!"
  12. set /a a-=1
  13. set c=!str:~%a%,1!
  14. set "p=!p:%c%=%b%!"
  15. set "p=!p:--%b%--=%c%!"
  16. if %a%==0 goto :3
  17. goto :2
  18. :3
  19. echo %p%
  20. pause
复制代码
发表于 2011-9-25 11:39:21 | 显示全部楼层

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set "nn=qQ wW eE rR tT yY uU iI oO pP aA sS dD fF gG hH jJ kK lL zZ xX cC vV bB nN mM"
  4. set "a=123a,B"
  5.                                                                                     
  6. :a
  7. set aa=!a:~0,1!
  8. set aaa=!a:~1!
  9. for %%a in (!nn!) do (
  10. set n=%%a
  11. set n1=!n:~0,1!
  12. set n2=!n:~1,1!
  13. if "!aa!"=="!n1!" (
  14. set /p=!n2!<nul) else (
  15. if "!aa!"=="!n2!" (
  16. set /p=!n1!<nul) else (set /p=!aa!<nul)
  17. )
  18. set a=!aaa!
  19. pause>nul
  20. if "a"=="" goto :end
  21. goto :a
  22. )
  23. :end
  24. pause
复制代码
为什么出问题了!!!!
发表于 2011-11-27 22:51:06 | 显示全部楼层
本帖最后由 lpy19870706 于 2011-11-27 22:53 编辑

不通用的

  1. @echo off
  2. set var=abHJ      dfsKHK  aB
  3. echo 替换前 %var%
  4. set a=%var:abHJ      dfsKHK  aB=AVhj      DFSkhk  Ab%
  5. echo 替换后 %a%
  6. pause>nul
复制代码
发表于 2011-12-13 19:08:51 | 显示全部楼层
  1. @echo off& setlocal enabledelayedexpansion

  2. set __var1=a b c d e f g h i j k l m n o p q r s t u v w x y z
  3. set __var2=A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
  4. set /p var=input strings:
  5. call :setvar __var1
  6. call :setvar __var2

  7. set n=0
  8. :chg
  9. if not "!var:~%n%,1!" equ "" (
  10.         if "!var:~%n%,1!" equ " " (set _vartmp=!_vartmp! ) else (
  11.                 set #tmp=!var:~%n%,1!
  12.                 for /f "tokens=2 delims==" %%i in ('set _!#tmp!') do (
  13.                         if not "!var:~%n%,1!" equ "%%i" set __vartmp=!__vartmp!%%i
  14.                 )
  15.         )
  16.         set /a n+=1
  17.         goto chg
  18. )
  19. echo !__vartmp!
  20. pause
  21. goto :eof

  22. :setvar
  23. for %%i in (!%1!) do set _%%i%1=%%i
  24. goto :eof
复制代码
发表于 2013-2-9 00:46:51 | 显示全部楼层
一翻旧帖才发现自己以前已经发过了奇葩代码,那就贴两个常规思路的吧,估计会撞车:
  1. @echo off&setlocal enabledelayedexpansion
  2. set "str=TestABC"

  3. set "str2=!str:~1!"
  4. set "大写=!str!"&set "小写=!str!"

  5. for %%a in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) do set "大写=!大写:%%a=%%a!"
  6. for %%a in (a b c d e f g h i j k l m n o p q r s t u v w x y z) do set "小写=!小写:%%a=%%a!"

  7. for /l %%a in (0 1 100) do (
  8.         if "!str:~%%a,1!"=="!小写:~%%a,1!" (
  9.                 set "str=!str:~,%%a!!大写:~%%a,1!!str2:~%%a!"
  10.         ) else (
  11.                 if "!str:~%%a,1!"=="!大写:~%%a,1!" set "str=!str:~,%%a!!小写:~%%a,1!!str2:~%%a!"
  12.         )
  13. )
  14. echo !str!
  15. pause
复制代码
  1. @echo off&setlocal enabledelayedexpansion
  2. set "str=TestABC"

  3. set "str=@!str!"
  4. for %%a in (a b c d e f g h i j k l m n o p q r s t u v w x y z)do set %%a=%%a

  5. for /l %%a in (1 1 8189)do (
  6.         if "!str:~%%a,1!"=="" (
  7.                 for /f "delims=" %%b in (^""!结果!"^")do echo %%~b&pause
  8.         )
  9.         set 结果=!结果!!str:~%%a,1!
  10.         if !str:~%%a^,1! leq Z if !str:~%%a^,1! geq a (
  11.                 for /f %%b in ("!str:~%%a,1!:") do (
  12.                         if %%b neq %%~db (set chr=%%~db)else set chr=!%%b~0!
  13.                 )
  14.                 set 结果=!结果:~,-1!!chr:~,1!
  15.         )
  16. )
复制代码
发表于 2013-6-5 22:40:00 | 显示全部楼层
本代码处理的字符串不得有空格和特殊符号,也就是只能是大小写字母。
  1. @echo off&setlocal enabledelayedexpansion
  2. set str=qdjSSM
  3. for /l %%i in (0 1 100) do (
  4.    if "!str:~%%i,1!" neq "" (
  5.       set "s=!s!!str:~%%i,1!  "
  6.    )
  7. )
  8. set "ll=A B C D E F G H I J K L M N O P Q R S T U V W X Y Z"
  9. set "ss=a b c d e f g h i j k l m n o p q r s t u v w x y z"
  10. for %%a in (%s%) do (
  11.    for %%b in (%ll%) do (
  12.       if /i %%a equ %%b (
  13.         if %%a neq %%b (
  14.            set res=!res!%%b
  15.         )
  16.       )
  17.    )
  18.    for %%b in (%ss%) do (
  19.       if /i %%a equ %%b (
  20.         if %%a neq %%b (
  21.            set res=!res!%%b
  22.         )
  23.       )
  24.    )
  25. )
  26. echo %res%
  27. pause
复制代码

评分

参与人数 1技术 +1 收起 理由
CrLf + 1 开始学了,必须鼓励鼓励~

查看全部评分

发表于 2015-12-14 22:03:45 | 显示全部楼层
  1. @echo off

  2. setlocal enabledelayedexpansion

  3. (for /f "delims=" %%i in ('type 示例文件.txt') do (
  4.    set "str=%%i"
  5.    for %%s in (a b c d e f g h i j k l m n o p q r s t u v w x y z) do set "str=!str:%%s=%%s!"
  6.    REM for %%s in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) do set "str=!str:%%s=%%s!"
  7.    echo.!str!
  8. ))>示例文件_new.txt
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-16 22:05 , Processed in 0.022866 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表