标题: 批处理将字符串中的字母大小写互换 [打印本页]
作者: 随风 时间: 2008-12-7 20:21 标题: 批处理将字符串中的字母大小写互换
将字符串中的字母大写换成小写,小写换成大写。
如:
复制代码
- 要求显示
- 转换前:abHJ dfsKHK aB
- 转换后: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
- @echo off
- setlocal EnableDelayedExpansion
- set /p var=请输入:
- 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
- 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
- cls & echo 转换前: %var%
-
- for %%a in (%var%) do call :replace %%a
- echo 转换后: %var%
- pause & exit /b
-
- :replace
- set "n="
- set "word2="
- set word=%1
- :loop
- set /a n+=1
- set one=!word:~-%n%,1!
- if %one% leq Z if %one% geq a (
- if "!Lowercase:%one%=%one%!" equ "%Lowercase%" (
- call :C %one% & goto next
- ) else (call :L %one% & goto next)
- )
- set "word2=%one%%word2%"
- :next
- if "!word:~%n%!" neq "" goto loop
- set var=!var:%word2%=%word2%!
- goto :eof
-
- :L
- for %%a in (%Lowercase%) do if /i %1==%%a set "word2=%%a%word2%" & goto :eof
-
- :C
- 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
- @echo off
- set /p var=Please input:
- for /f "delims=" %%a in ('^(echo e0:200 "%var%" ff^&more /e +5^<"%~f0"^)^|debug^|findstr "^[^-0]"^|findstr /v "Program Invalid"') do echo.%%a
- pause&exit/b
-
- a100
- mov ax,0
- mov ds,ax
- mov bx,200
- mov dl,[bx]
- cmp dl,41
- jb 112
- xor dl,20
- mov ah,2
- int 21
- inc bx
- mov al,[bx]
- cmp al,ff
- jnz 108
- int 20
-
- g
- q
- q
复制代码
作者: lhjoanna 时间: 2008-12-7 23:44
- @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: =#!
- :loop
- set "str_nul=!str_nul!!string:~,1! "&set string=!string:~1!
- if defined string goto loop
- for %%i in (!str_nul!) do (
- set flag=1
- for %%j in (!code!) do (
- if /i "%%i"=="%%j" if not "%%i"=="%%j" set str=!str!%%j&set flag=0
- )
- if !flag! equ 1 set str=!str!%%i
- )
- set "str=!str:#= !"
- echo.&echo 转换后:!str!
- 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
- 'P' 不是内部或外部命令,也不是可运行的程序
- 或批处理文件。
复制代码
这个不是非字母的问题啊,刚检查了下,是因为在给code赋值时 P 到了第二行了,应该是粘贴时不小心多按了回车,现已改过来了。对于特殊字符,不支持 ! ^ 。#符号我当成空格的标记了,如果需要显示可以修改下代码。
作者: youxi01 时间: 2008-12-8 13:17
利用一个特性:变量名不区分大小写,变量值却区分大小写。- @echo off&setlocal enabledelayedexpansion
- 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
- for %%i in (%str%) do set "var=%%i" & set !var:~0,1!=%%i
- set "TS="
- set /P TS=请输入测试字符(没考虑特殊字符):
- for /l %%i in (0 1 100) do (
- set "T3=!TS:~%%i,1!"
- if "!T3!"=="" goto :Res
- if defined !T3! (
- call set T2=%%!T3!:~0,1%%
- if "!T3!"=="!T2!" call set T2=%%!T3!:~1,1%%) else set "T2= "
- set Res=!Res!!T2!
- )
- :Res
- echo.&echo 转换前:!TS!
- echo 转换后:!Res!
- 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楼 的帖子
括起来后重新编辑出现乱码!!- @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-21 11:27 标题: 回复 18楼 的帖子
- @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!"
- )
- )
复制代码
作者: jadych 时间: 2009-2-6 09:06
- @echo off&setlocal enabledelayedexpansion
- set "var=abHJ dfsKHK aB"&echo !var!
- for /f "delims= tokens=1-3" %%i in ("%var%") do (
- set "x=%%i%%j%%k"
- set "x=!x:abHJ=ABhj!"
- set "x=!x:dfsKHK=DFSkhk!"
- set "x=!x: aB= Ab!"
- echo !x!
- )
- 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楼 的帖子
在教学区搜索“变量延迟扩展”
作者: zqz0012005 时间: 2009-2-26 16:28
- @echo off
- setlocal EnableDelayedExpansion
- set Lcase= abcdefghijklmnopqrstuvwxyz
- set Ucase= ABCDEFGHIJKLMNOPQRSTUVWXYZ
- for /l %%a in (1,1,26) do set _!Lcase:~%%a,1!=%%a
- set /p var=请输入:
- :loop
- set char=!var:~%pi%,1!
- set /a sn=_!char! 2>nul||set sn=0
- if defined char (
- if %sn% gtr 0 (
- if "!char!"=="!Lcase:~%sn%,1!" (set str=!str!!Ucase:~%sn%,1!) else (set str=!str!!Lcase:~%sn%,1!)
- ) else (
- set str=!str!!char!
- )
- set /a pi+=1
- goto loop
- )
- echo.!str!
- 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楼 的帖子
- 要是改为
-
- pause
-
- mode con cp select=936
- cls
- exit /b
-
- 就完美了
复制代码
[ 本帖最后由 myzwd 于 2009-2-27 23:05 编辑 ]
作者: keen 时间: 2009-4-1 23:47
- @echo off
- set /p var=please input:
- :start
- set "lstr=abcdefghijklmnopqrstuvwxyz"
- set "ustr=ABCDEFGHIJKLMNOPQRSTUVWXYZ"
- set vr=%var:~0,1%
- :loop
- set ls=%lstr:~0,1%
- set %ls%=%ustr:~0,1%
- if "%vr%"=="%ls%" call,set /p=%%%ls%%%<nul&goto next
- set us=%ustr:~0,1%
- set %us%=%lstr:~0,1%
- if "%vr%"=="%us%" call,set /p=%%%us%%%<nul&goto next
- set lstr=%lstr:~1%
- set ustr=%ustr:~1%
- if "%ustr%"=="" set /p= <nul&goto next
- goto loop
- :next
- set var=%var:~1%
- if "%var%"=="" goto end
- goto start
- :end
- echo.
- 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的程序,得到一点启示而进行修改的!希望楼主能够鉴定一下!- @echo off
- setlocal enabledelayedexpansion
- set "str=abHJ dfsKHK aB"
- echo 转换前的字符串是:%str%
- set/p=转换前的字符串是:<nul
- set "zm= abcdefghijklmnopqrstuvwxyzZYXWVUTSRQPONMLKJIHGFEDCBA"
- :a
- if not "!str:~%n%,1!"=="" (
- for /l %%a in (1 1 26) do (
- if "!str:~%n%,1!"=="!zm:~%%a,1!" (set/p=!zm:~-%%a,1!<nul&goto :b)
- if "!str:~%n%,1!"=="!zm:~-%%a,1!" (set/p=!zm:~%%a,1!<nul&goto :b)
- )
- set/p=!str:~%n%,1!<nul
- :b
- set/a n+=1&goto :a
- )
- pause>nul
复制代码
[ 本帖最后由 sjzong 于 2009-4-21 21:09 编辑 ]
作者: batman 时间: 2009-4-20 12:28
我也来个:- @echo off&setlocal enabledelayedexpansion
- set "str=abHJ dfsKHK aB"
- :lp
- 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 (
- set "temp=%%a"
- if "!str:~,1!" equ "!temp:~,1!" set /p=!temp:~1,1!<nul&goto next
- if "!str:~,1!" equ "!temp:~1,1!" set /p=!temp:~,1!<nul&goto next
- )
- set /p=!str:~,1!<nul
- :next
- set "str=!str:~1!"&if defined str goto lp
- 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
都忘了这个帖了,帖一下我的代码
- @echo off&Setlocal EnableDelayedExpansion
- set "Dxie=ABCDEFGHIJKLMNOPQRSTUVWXYZ"
- set "Xxie=abcdefghijklmnopqrstuvwxyz"
- set var=af SDF jfdi:LKJFIefIfifUfdf AsZfzG sJ
- echo 转换前:%var%
- for /l %%a in (0 1 25) do (
- set "D!Dxie:~%%a,1!=!Dxie:~%%a,1!"
- set "X!Xxie:~%%a,1!=!Xxie:~%%a,1!"
- )
- :loop
- set "str=!var:~0,1!"
- if "%str%"=="!D%str%!" (set num=!num!!X%str%!) else (
- if defined D!str! (set num=%num%!D%str%!) else set "num=%num%%str%"
- )
- set "var=%var:~1%"
- if defined var goto loop
- echo 转换后:%num%
- pause
复制代码
作者: rat 时间: 2009-4-20 14:03 标题: 回复 35楼 的帖子
改成这样?- @echo off&setlocal enabledelayedexpansion
- set "str=abHJ dfsKHK aB"
- :lp
- (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 (
- set "temp=%%a"
- if "!str:~,1!" equ "!temp:~,1!" set /p=!temp:~1,1!&goto next
- if "!str:~,1!" equ "!temp:~1,1!" set /p=!temp:~,1!&goto next
- )
- set /p=!str:~,1!)<nul
- :next
- set "str=!str:~1!"&if defined str goto lp
- pause>nul
复制代码
作者: zqz0012005 时间: 2009-4-21 16:06
其实25楼的代码也很不错^_^
作者: inittab 时间: 2009-4-22 11:43
跟版主的思路差不多.
-
-
- @echo off&setlocal enabledelayedexpansion
- 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 (
- set str=%%i&set #!str:~0,1!=!str:~1,1!&set $!str:~1,1!=!str:~0,1!)
- set/p strr=请输入:
- echo 转换前:%strr%
- set "st="
- set n=0
- :begin
- set str=!strr:~%n%,1!
- if "!str!"=="!#%str%!" (set st=!st!!$%str%!) else if "!str!"=="!$%str%!" (set st=!st!!#%str%!) else set "st=!st!!str!"
- set/a n+=1
- if not "!str!"=="" (goto begin)
- echo 转换后:!st!
复制代码
[ 本帖最后由 inittab 于 2009-4-22 11:57 编辑 ]
作者: pusofalse 时间: 2009-4-22 12:27
- @echo Off & setlocal EnableDelayedExpansion
- set "var=tEST" & set "str=!var!"
-
- 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"
- 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"
- For %%a in (%Lower%) do set "var=!var:%%a=%%a!"
- For /L %%a in (0 2 51) do (set "_!Lower:~%%a,1!=!Upper:~%%a,1!")
-
- :Loop
- If defined str (
- set "AlphaL=%str:~,1%" & set "AlphaU=%var:~,1%" & set "Letter=!AlphaU!
- If "!AlphaL!" equ "!AlphaU!" If defined _!AlphaL! (set "Letter=!_%str:~,1%!")
- set "str=%str:~1%" & set "var=%var:~1%"
- <nul set /p=!Letter!& goto :Loop
- )
- 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 标题: 我也来个
- rem 思路:先定义两个集合:大写和小写,然后逐字符分析。
- rem 调换两个变量即可实现小大写互换
-
- @echo off
- setlocal enabledelayedexpansion
-
- set temp_a=ABCDEFGHIJKLMNOPQRSTUVWXYZ
- set temp_b=abcdefghijklmnopqrstuvwxyz
-
- set /p temp_c=请输入:
- echo 转换前:%temp_c%
- for /l %%a in (0 1 10000000) do (
- set temp_n=!temp_c:~%%a,1!
- for /l %%b in (0 1 26) do (
- set temp_m=!temp_a:~%%b,1!
- if !temp_n! == !temp_m! (
- if defined temp_n (
- set temp_s=!temp_b:~%%b,1!
- call :sub !temp_n! !temp_s!
- ) else (
- echo 转换后:!temp_c!
- pause>nul
- exit
- )
- )
- )
- )
复制代码
作者: lxzzr 时间: 2009-4-23 01:25 标题: 回复 43楼 的帖子
水平有限,想不到更好的办法,呵呵
作者: hhl1987 时间: 2009-5-20 14:42
看一看先……………………
作者: batman 时间: 2009-11-14 16:56
首先设置变量提高点效率:- @echo off&setlocal enabledelayedexpansion
- 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 (
- set "code=%%a"&set "#!code:~,1!=!code:~1,1!"&set "_!code:~1,1!=!code:~,1!"
- )
- set /p str=请输入字符:&echo.&set /p=经转换后:<nul
- :lp
- if defined _%str:~,1% (
- if "%str:~,1%" equ "!#%str:~,1%!" (
- set /p=!_%str:~,1%!<nul
- ) else (
- set /p=!#%str:~,1%!<nul
- )
- ) else (
- set /p=%str:~,1%<nul
- )
- set "str=%str:~1%"
- if defined str goto lp
- pause>nul
复制代码
作者: zqz0012005 时间: 2009-11-14 18:26 标题: 回复 25楼 zqz0012005 的帖子
嗯,没必要将大小写字母定义在两个变量中。- @echo off
- set "letters= abcdefghijklmnopqrstuvwxyzZYXWVUTSRQPONMLKJIHGFEDCBA"
- for /l %%a in (1,1,26) do call set /a "_%%letters:~%%a,1%%=%%a"
- :input
- setlocal EnableDelayedExpansion
- echo 请输入:&set /p var=&if not defined var endlocal&goto:input
- :loop
- set char=!var:~%pi%,1!
- set /a sn=_!char! 2>nul||set sn=0
- if defined char (
- if %sn% gtr 0 (
- if "!char!"=="!letters:~%sn%,1!" (set str=!str!!letters:~-%sn%,1!) else (set str=!str!!letters:~%sn%,1!)
- ) else (
- set str=!str!!char!
- )
- set /a pi+=1
- goto loop
- )
- echo=!str!
- pause&endlocal&goto input
复制代码
作者: netbenton 时间: 2009-11-14 18:31
支持各种特殊情况
包括:复制代码
等符号- @echo off&setlocal enabledelayedexpansion
- 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
- 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
- set /p in=输入一个大小写都的有字符串:
- set n=0
- set out=
- for /l %%a in (0) do (
- for %%n in (!n!) do (
- for /f "delims=" %%b in ("!in:~%%n,1!") do (
- if defined @d%%b (
- if %%b equ !@D%%b! (set out=!out!!@x%%b!) else (set out=!out!!@D%%b!)
- ) else (
- set out=!out!^^%%b
- )
- set /a n+=1
- )
- if "!in:~%%n,1!" equ ";" set out=!out!;&set/a n+=1
- if %%n equ !n! echo;大小写互换为:!out!&PAUSE&exit
- )
- )
复制代码
[ 本帖最后由 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 的思路,不通用、不高效、不简洁、不考虑字符的兼容性:- aAcebFaJad
- cls
- @echo off&setlocal enabledelayedexpansion
- set str=#ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890
- set /p 字符串=<%0
- set 字
- call :strlen 字符串
- (for /l %%a in (1 1 !len!) do (
- choice /cs /c abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890 /n>nul
- for %%b in (!errorlevel!) do set 结 果 =!结 果 !!str:~%%b,1!
- ))<%0
- set 结
- pause
-
- :strlen
- setlocal enabledelayedexpansion
- set "$=!%1!#"
- 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!
- endlocal&If %2. neq . (set/a%2=%len%)else set len=%len%
复制代码
作者: batman 时间: 2011-7-15 11:48
vbs:- Dim inpStr, Arr, Str
- inpStr = InputBox("请输入要转换的字符串")
- 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", ",")
- For Each Str In Arr
- inpStr = Replace(inpStr, Str,"@#$&")
- inpStr = Replace(inpStr, UCase(Str), Str)
- inpStr = Replace(inpStr, "@#$&", UCase(str))
- Next
- MsgBox inpStr
复制代码
作者: CrLf 时间: 2011-7-15 12:07
本帖最后由 zm900612 于 2011-7-15 12:47 编辑
另一种逐字替换,兼容各种可见的特殊字符,调用 ascmap 后可以支持汉字:- @echo off
- set "字符串=WwW.baThOME.net"
- set 字
- setlocal enabledelayedexpansion
- set<nul>tmp /p=@!字符串!
- (for %%a in (tmp) do (
- for /l %%b in (1 2 %%~za) do echo;
- ))>k
-
- set str=@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@!"#$%%&'()*+,-./0123456789:;<=>?@abcdefghijklmnopqrstuvwxyz[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~
- for /f "skip=2 tokens=1,3" %%a in ('fc /b k tmp') do if "%%a" lss "1" set 结 果 =!结 果 !!str:~0x%%b,1!
-
- set 结
- del tmp k
- pause
复制代码
作者: mxxcgzxxx 时间: 2011-7-15 15:38
本帖最后由 mxxcgzxxx 于 2011-7-15 16:03 编辑
没事来个好玩的- @echo off
- setlocal enabledelayedexpansion
- set str=aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ
- :1
- set/p p=
- echo %p%|findstr "--[a-Z]--">nul&&echo 大哥没事写神马多减号嘛!重写! && ghoto :1
- set a=26
- :2
- set /a a-=1
- set b=!str:~%a%,1!
- set "p=!p:%b%=--%b%--!"
- set /a a-=1
- set c=!str:~%a%,1!
- set "p=!p:%c%=%b%!"
- set "p=!p:--%b%--=%c%!"
- if %a%==0 goto :3
- goto :2
- :3
- echo %p%
- pause
复制代码
作者: BS0小陈 时间: 2011-9-25 11:39
- @echo off
- setlocal enabledelayedexpansion
- 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"
- set "a=123a,B"
-
- :a
- set aa=!a:~0,1!
- set aaa=!a:~1!
- for %%a in (!nn!) do (
- set n=%%a
- set n1=!n:~0,1!
- set n2=!n:~1,1!
- if "!aa!"=="!n1!" (
- set /p=!n2!<nul) else (
- if "!aa!"=="!n2!" (
- set /p=!n1!<nul) else (set /p=!aa!<nul)
- )
- set a=!aaa!
- pause>nul
- if "a"=="" goto :end
- goto :a
- )
- :end
- pause
复制代码
为什么出问题了!!!!
作者: lpy19870706 时间: 2011-11-27 22:51
本帖最后由 lpy19870706 于 2011-11-27 22:53 编辑
不通用的- @echo off
- set var=abHJ dfsKHK aB
- echo 替换前 %var%
- set a=%var:abHJ dfsKHK aB=AVhj DFSkhk Ab%
- echo 替换后 %a%
- pause>nul
复制代码
作者: jains521 时间: 2011-12-13 19:08
- @echo off& setlocal enabledelayedexpansion
-
- 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
- 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
- set /p var=input strings:
- call :setvar __var1
- call :setvar __var2
-
- set n=0
- :chg
- if not "!var:~%n%,1!" equ "" (
- if "!var:~%n%,1!" equ " " (set _vartmp=!_vartmp! ) else (
- set #tmp=!var:~%n%,1!
- for /f "tokens=2 delims==" %%i in ('set _!#tmp!') do (
- if not "!var:~%n%,1!" equ "%%i" set __vartmp=!__vartmp!%%i
- )
- )
- set /a n+=1
- goto chg
- )
- echo !__vartmp!
- pause
- goto :eof
-
- :setvar
- for %%i in (!%1!) do set _%%i%1=%%i
- goto :eof
复制代码
作者: CrLf 时间: 2013-2-9 00:46
一翻旧帖才发现自己以前已经发过了奇葩代码,那就贴两个常规思路的吧,估计会撞车:- @echo off&setlocal enabledelayedexpansion
- set "str=TestABC"
-
- set "str2=!str:~1!"
- set "大写=!str!"&set "小写=!str!"
-
- 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!"
- 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!"
-
- for /l %%a in (0 1 100) do (
- if "!str:~%%a,1!"=="!小写:~%%a,1!" (
- set "str=!str:~,%%a!!大写:~%%a,1!!str2:~%%a!"
- ) else (
- if "!str:~%%a,1!"=="!大写:~%%a,1!" set "str=!str:~,%%a!!小写:~%%a,1!!str2:~%%a!"
- )
- )
- echo !str!
- pause
复制代码
- @echo off&setlocal enabledelayedexpansion
- set "str=TestABC"
-
- set "str=@!str!"
- 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
-
- for /l %%a in (1 1 8189)do (
- if "!str:~%%a,1!"=="" (
- for /f "delims=" %%b in (^""!结果!"^")do echo %%~b&pause
- )
- set 结果=!结果!!str:~%%a,1!
- if !str:~%%a^,1! leq Z if !str:~%%a^,1! geq a (
- for /f %%b in ("!str:~%%a,1!:") do (
- if %%b neq %%~db (set chr=%%~db)else set chr=!%%b~0!
- )
- set 结果=!结果:~,-1!!chr:~,1!
- )
- )
复制代码
作者: 悬崖之树 时间: 2013-6-5 22:40
本代码处理的字符串不得有空格和特殊符号,也就是只能是大小写字母。- @echo off&setlocal enabledelayedexpansion
- set str=qdjSSM
- for /l %%i in (0 1 100) do (
- if "!str:~%%i,1!" neq "" (
- set "s=!s!!str:~%%i,1! "
- )
- )
- 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"
- 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"
- for %%a in (%s%) do (
- for %%b in (%ll%) do (
- if /i %%a equ %%b (
- if %%a neq %%b (
- set res=!res!%%b
- )
- )
- )
- for %%b in (%ss%) do (
- if /i %%a equ %%b (
- if %%a neq %%b (
- set res=!res!%%b
- )
- )
- )
- )
- echo %res%
- pause
复制代码
作者: muink 时间: 2015-12-14 22:03
- @echo off
-
- setlocal enabledelayedexpansion
-
- (for /f "delims=" %%i in ('type 示例文件.txt') do (
- set "str=%%i"
- 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!"
- 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!"
- echo.!str!
- ))>示例文件_new.txt
复制代码
作者: codegay 时间: 2015-12-15 10:30
- """
- python大小写字符互换.py
- http://www.bathome.net/thread-2740-1-1.html
- 依山居 4:47 2015/12/15
- """
- s="sD8F8S88f899f9DiIujUUuj JhHUuH hH$%"
- def fn(x):
- if x.islower():
- return x.upper()
- elif x.isupper():
- return x.lower()
- else:
- return x
- result=''.join([fn(r) for r in list(s)])
- print(result)
-
- """
- 输出:
- Sd8f8s88F899F9dIiUJuuUJ jHhuUh Hh$%
- """
复制代码
作者: taofan712 时间: 2017-2-28 13:03
本帖最后由 taofan712 于 2017-2-28 13:06 编辑
- @echo off & setlocal enabledelayedexpansion
- (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
- :loop
- cls&echo;输入混杂大小写的字母串(不超过15位)&set /p var=
- for /l %%b in (0,1,15) do (
- set "zifu=!var:~%%b,1!"
- if "!zifu!"=="" pause>nul&goto loop
- for /f "tokens=2 delims=_" %%c in ('findstr /b "!zifu!" temp.txt') do set /p=%%c<nul
- )
- 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
你这样水真的好?
附一个:- ' 2>NUL&@(CLS&Set /p STR=键入:&CALL CSCRIPT -e:VBSCRIPT "%~0" "%%STR%%"&PAUSE&EXIT)
- Option Explicit
- Dim New_,i
- For i = 1 To Len(Wscript.Arguments(0))
- If UCase(Mid(Wscript.Arguments(0),i,1))=Mid(Wscript.Arguments(0),i,1) Then
- New_=New_&LCase(Mid(Wscript.Arguments(0),i,1))
- ElseIf LCase(Mid(Wscript.Arguments(0),i,1))=Mid(Wscript.Arguments(0),i,1) Then
- New_=New_&UCase(Mid(Wscript.Arguments(0),i,1))
- Else
- New_=New_&Mid(Wscript.Arguments(0),i,1)
- End If
- Next
- Wscript.echo New_
复制代码
作者: 懒虫阿布 时间: 2018-7-25 22:30
- @echo off
- setlocal enabledelayedexpansion
-
- REM 字符串大小写互换
- 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
- set SmallLetter=abcdefghijklmnopqrstuvwxyz
-
- set startIndex=0
- for %%i in (%BigLetter%) do (
- call set BigIndex=%%SmallLetter:~!startIndex!,1%%
- set arrayBig[!BigIndex!]=%%i
- set arraySmall[%%i]=!BigIndex!
- set /a startIndex+=1
- )
-
-
-
- set /p str=请输入要转换的字符串:
- echo %str%>str.txt
- echo .>>str.txt
- REM 获取输入字符串的长度
- for /f "tokens=1 delims=:" %%a in ('findstr /o .* str.txt') do (
- set /a strlen=%%a-2
- )
-
- echo string len=!strlen!
- set /a loopindex=!strlen!-1
- for /l %%i in (0, 1, !loopindex!) do (
- set letter=!str:~%%i, 1!
-
- call set smallchar=%%arraySmall[!letter!]%%
- call set bigchar=%%arrayBig[!letter!]%%
-
- if "!letter!" EQU "!smallchar!" (
- set retstr=!retstr!!bigchar!
- ) else if "!letter!" EQU "!bigchar!" (
- set retstr=!retstr!!smallchar!
- ) else (
- set retstr=!retstr!!letter!
- )
- )
-
- 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://www.bathome.net/) |
Powered by Discuz! 7.2 |