[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
  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
复制代码
为什么出问题了!!!!

TOP

本帖最后由 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
复制代码
世界上没有学不会的知识,也没有想得到却做不到的事!

TOP

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

TOP

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
复制代码
***共同提高***

TOP

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

TOP

試一試...
@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
带内地用语或带里语的文章,在下读写总觉有点吃力;
如误解了各位意思的讲勿见怪   ^_^

TOP

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

效率可是很高的了
确实是只有exit强行退出,还没想到其它办法来做到一个预处理全部完成的,只好用它了。

TOP

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

for /l 无限循环由于运行机制,其实不太实用。必须用 exit 强制退出整个bat,exit /b 或 goto 都不行。
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

支持各种特殊情况
包括:
  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 编辑 ]

TOP

回复 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
复制代码
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

首先设置变量提高点效率:
  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
复制代码
***共同提高***

TOP

看一看先……………………
1

评分人数

TOP

回复 43楼 的帖子

水平有限,想不到更好的办法,呵呵

TOP

我也来个

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

TOP

回复 40楼 的帖子

此类代码始终摆脱不了逐字判断,效率问题,goto次数等于 字符串个数。
兄的代码不觉得for循环次数比36楼要多些吗?
32、33楼虽用goto跳出for,但其实for循环是不会跳出的,只是停止运行里面的命令罢了。也就是说for循环次数等于字符串个数乘26
技术问题请到论坛发帖求助!

TOP

返回列表