Board logo

标题: 批处理将字符串中的字母大小写互换 [打印本页]

作者: 随风    时间: 2008-12-7 20:21     标题: 批处理将字符串中的字母大小写互换

将字符串中的字母大写换成小写,小写换成大写。
如:
  1. set var=abHJ      dfsKHK    aB
复制代码
  1. 要求显示
  2. 转换前:abHJ      dfsKHK    aB
  3. 转换后:ABhj      DFSkhk   Ab
复制代码

作者: suqili56    时间: 2008-12-7 21:32     标题: 指点下

@echo off
set var=abHJ      dfsKHK    aB
set/p b=AB%var:~2,18%AB
pause
作者: 随风    时间: 2008-12-7 21:37

汗,字符窜是随机的,没有规律。
作者: tireless    时间: 2008-12-7 22:49

  1. @echo off
  2. setlocal EnableDelayedExpansion
  3. set /p var=请输入:
  4. set Lowercase=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
  5. set Capital=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
  6. cls & echo 转换前: %var%
  7. for %%a in (%var%) do call :replace %%a
  8. echo 转换后: %var%
  9. pause & exit /b
  10. :replace
  11. set "n="
  12. set "word2="
  13. set word=%1
  14. :loop
  15. set /a n+=1
  16. set one=!word:~-%n%,1!
  17. if %one% leq Z if %one% geq a (
  18.   if "!Lowercase:%one%=%one%!" equ "%Lowercase%" (
  19.     call :C %one% & goto next
  20.   ) else (call :L %one% & goto next)
  21. )
  22. set "word2=%one%%word2%"
  23. :next
  24. if "!word:~%n%!" neq "" goto loop
  25. set var=!var:%word2%=%word2%!
  26. goto :eof
  27. :L
  28. for %%a in (%Lowercase%) do if /i %1==%%a set "word2=%%a%word2%" & goto :eof
  29. :C
  30. for %%a in (%Capital%) do if /i %1==%%a set "word2=%%a%word2%" & goto :eof
复制代码
有点乱。。

[ 本帖最后由 tireless 于 2008-12-8 01:50 编辑 ]
作者: rat    时间: 2008-12-7 22:56

  1. @echo off
  2. set /p var=Please input:
  3. for /f "delims=" %%a in ('^(echo e0:200 "%var%" ff^&more /e +5^<"%~f0"^)^|debug^|findstr "^[^-0]"^|findstr /v "Program Invalid"') do echo.%%a
  4. pause&exit/b
  5. a100
  6. mov ax,0
  7. mov ds,ax
  8. mov bx,200
  9. mov dl,[bx]
  10. cmp dl,41
  11. jb 112
  12. xor dl,20
  13. mov ah,2
  14. int 21
  15. inc bx
  16. mov al,[bx]
  17. cmp al,ff
  18. jnz 108
  19. int 20
  20. g
  21. q
  22. q
复制代码

作者: lhjoanna    时间: 2008-12-7 23:44

  1. @echo off&setlocal enabledelayedexpansion
  2. set /p "string=请输入字符串:"
  3. set "code=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 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 string=!string: =#!
  5. :loop
  6. set "str_nul=!str_nul!!string:~,1! "&set string=!string:~1!
  7. if defined string goto loop
  8. for %%i in (!str_nul!) do (
  9.     set flag=1
  10.     for %%j in (!code!) do (
  11.         if /i "%%i"=="%%j" if not "%%i"=="%%j" set str=!str!%%j&set flag=0
  12.     )
  13.     if !flag! equ 1 set str=!str!%%i
  14. )
  15. set "str=!str:#= !"
  16. echo.&echo 转换后:!str!
  17. pause>nul
复制代码
以上代码对于数字和空格原样输出,之前写过类似代码,见http://www.bathome.net/thread-2550-1-2.html中第二个功能。

[ 本帖最后由 lhjoanna 于 2008-12-8 01:56 编辑 ]
作者: tireless    时间: 2008-12-8 00:13     标题: 回复 6楼 的帖子

遇到非字母会有问题:
请输入字符串:bbs.bathome.net
'P' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

转换后BBs.bathome.net

作者: pusofalse    时间: 2008-12-8 01:18

指定的字符串中会有特殊字符吗?
作者: lhjoanna    时间: 2008-12-8 01:56

  1. 'P' 不是内部或外部命令,也不是可运行的程序
  2. 或批处理文件。
复制代码
这个不是非字母的问题啊,刚检查了下,是因为在给code赋值时 P 到了第二行了,应该是粘贴时不小心多按了回车,现已改过来了。对于特殊字符,不支持 !  ^ 。#符号我当成空格的标记了,如果需要显示可以修改下代码。
作者: youxi01    时间: 2008-12-8 13:17

利用一个特性:变量名不区分大小写,变量值却区分大小写。
  1. @echo off&setlocal enabledelayedexpansion
  2. set str=aA bB cC dD eE fF gG hH iI jJ kK lL mM nN oO pP qQ rR sS tT uU vV wW xX yY zZ
  3. for %%i in (%str%) do set "var=%%i" & set !var:~0,1!=%%i
  4. set "TS="
  5. set /P TS=请输入测试字符(没考虑特殊字符):
  6. for /l %%i in (0 1 100) do (
  7.         set "T3=!TS:~%%i,1!"
  8.         if "!T3!"=="" goto :Res
  9.         if defined !T3! (
  10.                 call set T2=%%!T3!:~0,1%%
  11.                 if "!T3!"=="!T2!" call set T2=%%!T3!:~1,1%%) else set "T2= "
  12.         set Res=!Res!!T2!
  13. )
  14. :Res
  15. echo.&echo 转换前:!TS!
  16. echo 转换后:!Res!
  17. pause>nul
复制代码

作者: 随风    时间: 2008-12-8 15:15     标题: 回复 10楼 的帖子

set var=abc  ## adf
这种情况下把#号替换成了空格。
作者: firewolf85    时间: 2008-12-8 17:38

原帖由 rat 于 2008-12-7 22:56 发表
@echo off
set /p var=Please input:
for /f "delims=" %%a in ('^(echo e0:200 "%var%" ff^&more /e +5^

汇编吗?很眼熟的说。
作者: youxi01    时间: 2008-12-8 17:48

原帖由 随风 于 2008-12-8 15:15 发表
set var=abc  ## adf
这种情况下把#号替换成了空格。

呵呵,只处理 字母 和空格,当初设计的时候
没考虑完全啊
作者: rat    时间: 2008-12-8 19:46

原帖由 firewolf85 于 2008-12-8 17:38 发表

汇编吗?很眼熟的说。


是。就会一点点而已:(
作者: skuny    时间: 2009-1-15 19:24

@ECHO OFF&setlocal enabledelayedexpansion
:222
set st=
set /p "strr=请输入字符串:"
echo 转换前!strr!
call :111 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
echo 转换后:!st!
pause>nul&goto :222
:111
for /l %%a in (0,1,100) do (
  set "stt=!strr:~%%a,1!"
  if not defined stt goto :eof
  set /a aaa=0
    for %%i in (%*) do (
    set /a aaa+=1
    if /i "!stt!"=="%%i" (
         if not "!stt!"=="%%i" set "st=!st!%%i"&set /a aaa=0
         if "!stt!"=="%%i" (
             set "bb=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 %%k in (!bb!) do if /i "!stt!"=="%%k" set "st=!st!%%k"&set /a aaa=0
                   )
               )
    if !aaa!==26 set "st=!st!!stt!" 
        )                    
)

[ 本帖最后由 skuny 于 2009-1-15 19:34 编辑 ]
作者: skuny    时间: 2009-1-15 19:35

为什么用不能用code括起来 正解看 15楼

[ 本帖最后由 skuny 于 2009-1-19 11:17 编辑 ]
作者: Batcher    时间: 2009-1-19 13:35     标题: 回复 16楼 的帖子

Q: 如何用code把代码扩起来?
A: http://bbs.bathome.net/thread-404-1-1.html
作者: skuny    时间: 2009-1-21 11:25     标题: 回复 17楼 的帖子

括起来后重新编辑出现乱码!!
  1. @ECHO OFF&setlocal enabledelayedexpansion
  2. :222
  3. set st=
  4. set /p "strr=请输入字符串:"
  5. echo 转换前!strr!
  6. call :111 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
  7. echo 转换后:!st!
  8. pause>nul&goto :222
  9. :111
  10. for /l %%a in (0,1,100) do (
  11.   set "stt=!strr:~%%a,1!"
  12.   if not defined stt goto :eof
  13.   set /a aaa=0
  14.     for %%i in (%*) do (
  15.     set /a aaa+=1
  16.     if /i "!stt!"=="%%i" (
  17.          if not "!stt!"=="%%i" set "st=!st!%%i"&set /a aaa=0
  18.          if "!stt!"=="%%i" (
  19.              set "bb=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"
  20.              for %%k in (!bb!) do if /i "!stt!"=="%%k" set "st=!st!%%k"&set /a aaa=0
  21.                    )
  22.                )
  23.     if !aaa!==26 set "st=!st!!stt!"
  24.         )                    
  25. )
复制代码

作者: skuny    时间: 2009-1-21 11:27     标题: 回复 18楼 的帖子

  1. @ECHO OFF&setlocal enabledelayedexpansion
  2. :222
  3. set st=
  4. set /p "strr=请输入字符串:"
  5. echo 转换前!strr!
  6. call :111 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
  7. echo 转换后:!st!
  8. pause>nul&goto :222
  9. :111
  10. for /l %%a in (0,1,100) do (
  11.   set "stt=!strr:~%%a,1!"
  12.   if not defined stt goto :eof
  13.   set /a aaa=0
  14.     for %%i in (%*) do (
  15.     set /a aaa+=1
  16.     if /i "!stt!"=="%%i" (
  17.          if not "!stt!"=="%%i" set "st=!st!%%i"&set /a aaa=0
  18.          if "!stt!"=="%%i" (
  19.              set "bb=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"
  20.              for %%k in (!bb!) do if /i "!stt!"=="%%k" set "st=!st!%%k"&set /a aaa=0
  21.                    )
  22.                )
  23.     if !aaa!==26 set "st=!st!!stt!"
  24.         )                    
  25. )
复制代码

作者: jadych    时间: 2009-2-6 09:06

  1. @echo off&setlocal enabledelayedexpansion
  2. set "var=abHJ      dfsKHK    aB"&echo !var!
  3. for /f "delims=  tokens=1-3" %%i in ("%var%") do (
  4. set "x=%%i%%j%%k"
  5. set "x=!x:abHJ=ABhj!"
  6. set "x=!x:dfsKHK=DFSkhk!"
  7. set "x=!x: aB= Ab!"
  8. echo !x!
  9. )
  10. pause>nul
复制代码

作者: youxi01    时间: 2009-2-6 09:50

LS错
大小写互换,对象不是确定的
不只是适合自己给定的一段字符
作者: moshou    时间: 2009-2-6 19:19     标题: 回复 10楼 的帖子

在学习的时候不明白这一段set !var:~0,1!=%%i起到什么作用
还有经常看到set Res=!Res!!T2!这样的语句,就是后面的这个!T2!是什么意思
作者: myzwd    时间: 2009-2-26 13:50     标题: 回复 1楼 的帖子

@echo off
echo. 大小写字母转换--Uppercase-reChange-Lowercase-----------

set small=a b c d e f g h i j k l m o p q r s t u v w x y z
set big=A B C D E F G H I J K L M N O P Q R S T U V W S Y Z
set tt=abHJ   dfsKHK      aB
rem 以上是原始字符可以改为命令输入set /p tt=
echo  转换前的字符:%tt%
setlocal enabledelayedexpansion
ne
set tt1=!tt:~-1!
set tt2=!tt:~0,-1!
set tt=!tt1!+!tt2!
if  !tt:~-1! neq + (goto:one) else (set tt=!tt:+=,!&echo 插入逗号后:!tt!)

:a
for  %%i in (!small!) do (
    for %%j in (!tt!) do (
    if %%i==%%j (set sml=!sml!%%j )
    )
)

:b
for %%i in (!big!) do (
    for %%j in (!tt!) do (
    if %%i==%%j (set bg=!bg!%%j )
    )
)

:end
echo 原始字符里面的小写字母:!sml!
echo 原始字符里面的大写字母:!bg!

for %%1 in (!big!) do (
    for %%2 in (!sml!) do (
    if /i %%1==%%2 (set tt=!tt:%%2=%%1! )
    )
)
echo 把原始字符里的小写转换成大写:!tt!

for %%1 in (!small!) do (
    for %%2 in (!bg!) do (
    if /i %%1==%%2 (set tt=!tt:%%2=%%1! &echo !tt!)
    )
)
set tt=!tt:,=!
echo  转换后的字符:!tt!-成功.ok!

[ 本帖最后由 myzwd 于 2009-2-26 13:52 编辑 ]
作者: Batcher    时间: 2009-2-26 14:25     标题: 回复 22楼 的帖子

在教学区搜索“变量延迟扩展”

Q: 如何使用论坛的搜索功能来解决自己的问题?
A: 参考:http://bbs.bathome.net/thread-3473-1-1.html

作者: zqz0012005    时间: 2009-2-26 16:28

  1. @echo off
  2. setlocal EnableDelayedExpansion
  3. set Lcase= abcdefghijklmnopqrstuvwxyz
  4. set Ucase= ABCDEFGHIJKLMNOPQRSTUVWXYZ
  5. for /l %%a in (1,1,26) do set _!Lcase:~%%a,1!=%%a
  6. set /p var=请输入:
  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!"=="!Lcase:~%sn%,1!" (set str=!str!!Ucase:~%sn%,1!) else (set str=!str!!Lcase:~%sn%,1!)
  13. ) else (
  14.     set str=!str!!char!
  15. )
  16. set /a pi+=1
  17. goto loop
  18. )
  19. echo.!str!
  20. echo.&pause
复制代码

作者: myzwd    时间: 2009-2-27 15:45     标题: 回复 1楼 的帖子-

@echo off
cls
echo -----大小写转换--不能输入同时含有象m和M这类字符--
set small=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 big=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 /p char=
setlocal enabledelayedexpansion


:start
set charend=!char:~-1!
set chardel=!char:~,-1!
set char=!charend!+!chardel!
if !char:~-1! neq + (goto start) else (set char=!char:+=!)
echo 字符状态: !char!

:sml
for %%i in (!small!) do (
    for %%j in (!char!) do (
       if %%i == %%j (set sml=!sml! %%j)
    )  
)
echo sml集合: !sml!

:bg
for %%i in (!big!) do (
    for %%j in (!char!) do (
       if %%i == %%j (set bg=!bg!%%j )
    )  
)
echo bg集合: !bg!

:small
set charend=!char:~,1!
for %%i in (!sml!) do (
  if !charend! == %%i (
     for %%j in (!big!) do (
         if /i %%j == !charend! (set charend=%%j)
     )
  )
)
:big
for %%i in (!bg!) do (
  if !charend! == %%i (
     for %%j in (!small!) do (
         if /i %%j == !charend! (set charend=%%j)
     )
  )
)

set chardel=!char:~1!
set char=!chardel!+!charend!
if  !charend! neq +  (goto small)
set char=!char:+=!
echo 新字符状态:!char!

如果有一个字母大小写都含有时,没法转换,这改怎么办?
作者: zqz0012005    时间: 2009-2-27 16:56     标题: 回复 26楼 的帖子

那就说明你的方法还不够好,继续改进。
作者: myzwd    时间: 2009-2-27 22:54     标题: 回复 5楼 的帖子

  1. 要是改为
  2. pause
  3. mode con cp select=936
  4. cls
  5. exit /b
  6. 就完美了
复制代码

[ 本帖最后由 myzwd 于 2009-2-27 23:05 编辑 ]
作者: keen    时间: 2009-4-1 23:47

  1. @echo off
  2. set /p var=please input:
  3. :start
  4. set "lstr=abcdefghijklmnopqrstuvwxyz"
  5. set "ustr=ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  6. set vr=%var:~0,1%
  7. :loop
  8. set ls=%lstr:~0,1%
  9. set %ls%=%ustr:~0,1%
  10. if "%vr%"=="%ls%" call,set /p=%%%ls%%%<nul&goto next
  11. set us=%ustr:~0,1%
  12. set %us%=%lstr:~0,1%
  13. if "%vr%"=="%us%" call,set /p=%%%us%%%<nul&goto next
  14. set lstr=%lstr:~1%
  15. set ustr=%ustr:~1%
  16. if "%ustr%"=="" set /p= <nul&goto next
  17. goto loop
  18. :next
  19. set var=%var:~1%
  20. if "%var%"=="" goto end
  21. goto start
  22. :end
  23. echo.
  24. pause
复制代码

[ 本帖最后由 keen 于 2009-4-2 13:17 编辑 ]
作者: mckobe    时间: 2009-4-13 16:35

@echo off&setlocal enabledelayedexpansion
set /p "string=请输入字符串:"
set "code=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 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 string=!string: =#!

请问在这段代码中: set /p "string=请输入字符串:" 和set /p string=请输入字符串:    有什么区别?
另外"set string=!string: =#!“是变量扩展吗?他是什么含意
谢谢
作者: Batcher    时间: 2009-4-13 18:15     标题: 回复 30楼 的帖子

1、当用户输入的字符串中包含特殊字符时,后者可能出错。
2、是变量替换的意思,把空格替换成井号。
作者: sjzong    时间: 2009-4-17 01:45     标题: 我也来一个!

我这个是看到batman的程序,得到一点启示而进行修改的!希望楼主能够鉴定一下!
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set "str=abHJ      dfsKHK    aB"
  4. echo 转换前的字符串是:%str%
  5. set/p=转换前的字符串是:<nul
  6. set "zm= abcdefghijklmnopqrstuvwxyzZYXWVUTSRQPONMLKJIHGFEDCBA"
  7. :a
  8. if not "!str:~%n%,1!"=="" (
  9.    for /l %%a in (1 1 26) do (
  10.     if "!str:~%n%,1!"=="!zm:~%%a,1!" (set/p=!zm:~-%%a,1!<nul&goto :b)
  11.     if "!str:~%n%,1!"=="!zm:~-%%a,1!" (set/p=!zm:~%%a,1!<nul&goto :b)
  12.    )
  13.    set/p=!str:~%n%,1!<nul
  14. :b
  15.   set/a n+=1&goto :a
  16. )
  17. pause>nul
复制代码

[ 本帖最后由 sjzong 于 2009-4-21 21:09 编辑 ]
作者: batman    时间: 2009-4-20 12:28

我也来个:
  1. @echo off&setlocal enabledelayedexpansion
  2. set "str=abHJ      dfsKHK    aB"
  3. :lp
  4. for %%a in (aA bB cC dD eE fF gG hH iI jJ kK lL mM nN oO pP qQ rR sS tT uU vV wW xX yY zZ) do (
  5.      set "temp=%%a"
  6.      if "!str:~,1!" equ "!temp:~,1!" set /p=!temp:~1,1!<nul&goto next
  7.      if "!str:~,1!" equ "!temp:~1,1!" set /p=!temp:~,1!<nul&goto next
  8. )
  9. set /p=!str:~,1!<nul
  10. :next
  11. set "str=!str:~1!"&if defined str goto lp
  12. pause>nul
复制代码

[ 本帖最后由 batman 于 2009-4-20 13:28 编辑 ]
作者: rat    时间: 2009-4-20 13:11     标题: 回复 33楼 的帖子

运行结果不对
作者: batman    时间: 2009-4-20 13:28

回楼上,是多写个c字符,已改正
作者: 随风    时间: 2009-4-20 13:38

都忘了这个帖了,帖一下我的代码
  1. @echo off&Setlocal EnableDelayedExpansion
  2. set "Dxie=ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  3. set "Xxie=abcdefghijklmnopqrstuvwxyz"
  4. set var=af SDF jfdi:LKJFIefIfifUfdf  AsZfzG sJ
  5. echo            转换前:%var%
  6. for /l %%a in (0 1 25) do (
  7.   set "D!Dxie:~%%a,1!=!Dxie:~%%a,1!"
  8.   set "X!Xxie:~%%a,1!=!Xxie:~%%a,1!"
  9. )
  10. :loop
  11. set "str=!var:~0,1!"
  12. if "%str%"=="!D%str%!" (set num=!num!!X%str%!) else (
  13.   if defined D!str! (set num=%num%!D%str%!) else set "num=%num%%str%"
  14. )
  15. set "var=%var:~1%"
  16. if defined var goto loop
  17. echo            转换后:%num%
  18. pause
复制代码

作者: rat    时间: 2009-4-20 14:03     标题: 回复 35楼 的帖子

改成这样?
  1. @echo off&setlocal enabledelayedexpansion
  2. set "str=abHJ      dfsKHK    aB"
  3. :lp
  4. (for %%a in (aA bB cC dD eE fF gG hH iI jJ kK lL mM nN oO pP qQ rR sS tT uU vV wW xX yY zZ) do (
  5.      set "temp=%%a"
  6.      if "!str:~,1!" equ "!temp:~,1!" set /p=!temp:~1,1!&goto next
  7.      if "!str:~,1!" equ "!temp:~1,1!" set /p=!temp:~,1!&goto next
  8. )
  9. set /p=!str:~,1!)<nul
  10. :next
  11. set "str=!str:~1!"&if defined str goto lp
  12. pause>nul
复制代码

作者: zqz0012005    时间: 2009-4-21 16:06

其实25楼的代码也很不错^_^
作者: inittab    时间: 2009-4-22 11:43

跟版主的思路差不多.
  1. @echo off&setlocal enabledelayedexpansion
  2. for %%i in (Aa Bb Cc Dd Ee Ff Gg Hh Ii Jj Kk Ll Mm Nn Oo Pp Qq Rr Ss Tt Uu Vv Ww Xx Yy Zz) do (
  3. set str=%%i&set #!str:~0,1!=!str:~1,1!&set $!str:~1,1!=!str:~0,1!)
  4. set/p strr=请输入:
  5. echo 转换前:%strr%
  6. set "st="
  7. set n=0
  8. :begin
  9. set str=!strr:~%n%,1!
  10. if "!str!"=="!#%str%!" (set st=!st!!$%str%!) else if "!str!"=="!$%str%!" (set st=!st!!#%str%!) else set "st=!st!!str!"
  11. set/a n+=1
  12. if not "!str!"=="" (goto begin)
  13. echo 转换后:!st!
复制代码

[ 本帖最后由 inittab 于 2009-4-22 11:57 编辑 ]
作者: pusofalse    时间: 2009-4-22 12:27

  1. @echo Off & setlocal EnableDelayedExpansion
  2. set "var=tEST" & set "str=!var!"
  3. set "Lower=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 "Upper=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"
  5. For %%a in (%Lower%) do set "var=!var:%%a=%%a!"
  6. For /L %%a in (0 2 51) do (set "_!Lower:~%%a,1!=!Upper:~%%a,1!")
  7. :Loop
  8. If defined str (
  9.     set "AlphaL=%str:~,1%" & set "AlphaU=%var:~,1%" & set "Letter=!AlphaU!
  10.     If "!AlphaL!" equ "!AlphaU!" If defined _!AlphaL! (set "Letter=!_%str:~,1%!")
  11.     set "str=%str:~1%" & set "var=%var:~1%"
  12.     <nul set /p=!Letter!& goto :Loop
  13. )
  14. Echo\ & Pause>nul
复制代码

作者: 随风    时间: 2009-4-22 14:34     标题: 回复 40楼 的帖子

此类代码始终摆脱不了逐字判断,效率问题,goto次数等于 字符串个数。
兄的代码不觉得for循环次数比36楼要多些吗?
32、33楼虽用goto跳出for,但其实for循环是不会跳出的,只是停止运行里面的命令罢了。也就是说for循环次数等于字符串个数乘26
作者: lxzzr    时间: 2009-4-23 01:16     标题: 我也来个

  1. rem 思路:先定义两个集合:大写和小写,然后逐字符分析。
  2. rem 调换两个变量即可实现小大写互换
  3. @echo off
  4. setlocal enabledelayedexpansion
  5. set temp_a=ABCDEFGHIJKLMNOPQRSTUVWXYZ
  6. set temp_b=abcdefghijklmnopqrstuvwxyz
  7. set /p temp_c=请输入:
  8. echo 转换前:%temp_c%
  9. for /l %%a in (0 1 10000000) do (
  10. set temp_n=!temp_c:~%%a,1!
  11. for /l %%b in (0 1 26) do (
  12. set temp_m=!temp_a:~%%b,1!
  13. if !temp_n! == !temp_m! (
  14. if defined temp_n (
  15. set temp_s=!temp_b:~%%b,1!
  16. call :sub !temp_n! !temp_s!
  17. ) else (
  18. echo 转换后:!temp_c!
  19. pause>nul
  20. exit
  21. )
  22. )
  23. )
  24. )
复制代码

作者: lxzzr    时间: 2009-4-23 01:25     标题: 回复 43楼 的帖子

水平有限,想不到更好的办法,呵呵
作者: hhl1987    时间: 2009-5-20 14:42

看一看先……………………
作者: batman    时间: 2009-11-14 16:56

首先设置变量提高点效率:
  1. @echo off&setlocal enabledelayedexpansion
  2. for %%a in (aA bB cC dD eE fF gG hH iI jJ kK lL mM nN oO pP qQ rR sS tT uU vV wW xX yY zZ) do (
  3.     set "code=%%a"&set "#!code:~,1!=!code:~1,1!"&set "_!code:~1,1!=!code:~,1!"
  4. )
  5. set /p str=请输入字符:&echo.&set /p=经转换后:<nul
  6. :lp
  7. if defined _%str:~,1% (
  8.    if "%str:~,1%" equ "!#%str:~,1%!" (
  9.       set /p=!_%str:~,1%!<nul
  10.       ) else (
  11.       set /p=!#%str:~,1%!<nul
  12.    )
  13.    ) else (
  14.    set /p=%str:~,1%<nul
  15. )
  16. set "str=%str:~1%"
  17. if defined str goto lp
  18. pause>nul
复制代码

作者: zqz0012005    时间: 2009-11-14 18:26     标题: 回复 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
复制代码

作者: netbenton    时间: 2009-11-14 18:31

支持各种特殊情况
包括:
  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 编辑 ]
作者: zqz0012005    时间: 2009-11-14 18:48

不要忘了 for /f 的 eol 隐患,呵呵。

for /l 无限循环由于运行机制,其实不太实用。必须用 exit 强制退出整个bat,exit /b 或 goto 都不行。
作者: netbenton    时间: 2009-11-14 19:29

re zqz0012005
48楼又经修改,增加了以下特殊符号的处理:
^ ; !

效率可是很高的了
确实是只有exit强行退出,还没想到其它办法来做到一个预处理全部完成的,只好用它了。
作者: Taurus    时间: 2009-11-15 14:14

試一試...
@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

作者: CrLf    时间: 2011-7-15 11:23

本帖最后由 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%
复制代码

作者: batman    时间: 2011-7-15 11:48

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
复制代码

作者: CrLf    时间: 2011-7-15 12:07

本帖最后由 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
复制代码

作者: mxxcgzxxx    时间: 2011-7-15 15:38

本帖最后由 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
复制代码

作者: BS0小陈    时间: 2011-9-25 11:39

  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
复制代码
为什么出问题了!!!!
作者: lpy19870706    时间: 2011-11-27 22:51

本帖最后由 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
复制代码

作者: jains521    时间: 2011-12-13 19:08

  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
复制代码

作者: CrLf    时间: 2013-2-9 00:46

一翻旧帖才发现自己以前已经发过了奇葩代码,那就贴两个常规思路的吧,估计会撞车:
  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

本代码处理的字符串不得有空格和特殊符号,也就是只能是大小写字母。
  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
复制代码

作者: muink    时间: 2015-12-14 22:03

  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
复制代码

作者: codegay    时间: 2015-12-15 10:30

  1. """
  2. python大小写字符互换.py
  3. http://www.bathome.net/thread-2740-1-1.html
  4. 依山居 4:47 2015/12/15
  5. """
  6. s="sD8F8S88f899f9DiIujUUuj JhHUuH hH$%"
  7. def fn(x):
  8.     if x.islower():
  9.         return x.upper()
  10.     elif x.isupper():
  11.         return x.lower()
  12.     else:
  13.         return x
  14. result=''.join([fn(r) for r in list(s)])
  15. print(result)
  16. """
  17. 输出:
  18. Sd8f8s88F899F9dIiUJuuUJ jHhuUh Hh$%
  19. """
复制代码

作者: taofan712    时间: 2017-2-28 13:03

本帖最后由 taofan712 于 2017-2-28 13:06 编辑
  1. @echo off & setlocal enabledelayedexpansion
  2. (for %%a in (a_A b_B c_C d_D e_E f_F g_G h_H i_I j_J k_K l_L m_M n_N o_O p_P q_Q r_R s_S t_T u_U v_V w_W x_X y_Y z_Z A_a B_b C_c D_d E_e F_f G_g H_h I_i J_j K_k L_l M_m N_n O_o P_p Q_q R_r S_s T_t U_u V_v W_w X_x Y_y Z_z) do echo;%%a)>temp.txt
  3. :loop
  4. cls&echo;输入混杂大小写的字母串(不超过15位)&set /p var=
  5. for /l %%b in (0,1,15) do (
  6. set "zifu=!var:~%%b,1!"
  7. if "!zifu!"=="" pause>nul&goto loop
  8. for /f "tokens=2 delims=_" %%c in ('findstr /b "!zifu!" temp.txt') do set /p=%%c<nul
  9. )
  10. pause&goto loop
复制代码
有趣哈,想了好一会儿才搞出个答案。
作者: niudd    时间: 2017-3-3 19:29

要点积分看文章。
作者: niudd    时间: 2017-3-3 19:30

要点积分看文章。
作者: niudd    时间: 2017-3-3 19:57

要点积分看文章。
作者: 老刘1号    时间: 2017-3-3 20:46

回复 66# niudd


    你这样水真的好?
附一个:
  1. ' 2>NUL&@(CLS&Set /p STR=键入:&CALL CSCRIPT -e:VBSCRIPT "%~0" "%%STR%%"&PAUSE&EXIT)
  2. Option Explicit
  3. Dim New_,i
  4. For i = 1 To Len(Wscript.Arguments(0))
  5. If UCase(Mid(Wscript.Arguments(0),i,1))=Mid(Wscript.Arguments(0),i,1) Then
  6. New_=New_&LCase(Mid(Wscript.Arguments(0),i,1))
  7. ElseIf LCase(Mid(Wscript.Arguments(0),i,1))=Mid(Wscript.Arguments(0),i,1) Then
  8. New_=New_&UCase(Mid(Wscript.Arguments(0),i,1))
  9. Else
  10. New_=New_&Mid(Wscript.Arguments(0),i,1)
  11. End If
  12. Next
  13. Wscript.echo New_
复制代码

作者: 懒虫阿布    时间: 2018-7-25 22:30

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. REM 字符串大小写互换
  4. set BigLetter=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
  5. set SmallLetter=abcdefghijklmnopqrstuvwxyz
  6. set startIndex=0
  7. for %%i in (%BigLetter%) do (
  8. call set BigIndex=%%SmallLetter:~!startIndex!,1%%
  9. set arrayBig[!BigIndex!]=%%i
  10. set arraySmall[%%i]=!BigIndex!
  11. set /a startIndex+=1
  12. )
  13. set /p str=请输入要转换的字符串:
  14. echo %str%>str.txt
  15. echo .>>str.txt
  16. REM 获取输入字符串的长度
  17. for /f "tokens=1 delims=:" %%a in ('findstr /o .* str.txt') do (
  18. set  /a strlen=%%a-2
  19. )
  20. echo string len=!strlen!
  21. set /a loopindex=!strlen!-1
  22. for /l %%i in (0, 1, !loopindex!) do (
  23. set letter=!str:~%%i, 1!
  24. call set smallchar=%%arraySmall[!letter!]%%
  25. call set bigchar=%%arrayBig[!letter!]%%
  26. if "!letter!" EQU "!smallchar!" (
  27. set retstr=!retstr!!bigchar!
  28. ) else if "!letter!" EQU "!bigchar!" (
  29. set retstr=!retstr!!smallchar!
  30. ) else (
  31. set retstr=!retstr!!letter!
  32. )
  33. )
  34. echo retstr=!retstr!
复制代码

作者: tiandyoin    时间: 2023-9-19 06:16

回复 53# CrLf


    没看出哪哪里用了 ascmap ,结果是:
字符串=WwW.baThOME.net
结 果 =RRh}|OJH`h
作者: wanghan519    时间: 2023-9-19 07:04

试了一下tr a-zA-Z A-Za-z似乎可以




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