批处理之家's Archiver

随风 发表于 2008-12-7 20:21

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

将字符串中的字母大写换成小写,小写换成大写。
如:
[code]
set var=abHJ      dfsKHK    aB
[/code]
[code]
要求显示
转换前:abHJ      dfsKHK    aB
转换后:ABhj      DFSkhk   Ab
[/code]

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

[code]@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[/code]有点乱。。

[[i] 本帖最后由 tireless 于 2008-12-8 01:50 编辑 [/i]]

rat 发表于 2008-12-7 22:56

[code]@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[/code]

lhjoanna 发表于 2008-12-7 23:44

[code]@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
[/code]以上代码对于数字和空格原样输出,之前写过类似代码,见[url=http://www.bathome.net/thread-2550-1-2.html]http://www.bathome.net/thread-2550-1-2.html[/url]中第二个功能。

[[i] 本帖最后由 lhjoanna 于 2008-12-8 01:56 编辑 [/i]]

tireless 发表于 2008-12-8 00:13

回复 6楼 的帖子

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

转换后BBs.bathome.net[/quote]

pusofalse 发表于 2008-12-8 01:18

指定的字符串中会有特殊字符吗?

lhjoanna 发表于 2008-12-8 01:56

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

youxi01 发表于 2008-12-8 13:17

利用一个特性:变量名不区分大小写,变量值却区分大小写。[code]
@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

[/code]

随风 发表于 2008-12-8 15:15

回复 10楼 的帖子

set var=abc  ## adf
这种情况下把#号替换成了空格。

firewolf85 发表于 2008-12-8 17:38

[quote]原帖由 [i]rat[/i] 于 2008-12-7 22:56 发表 [url=http://bbs.bathome.net/redirect.php?goto=findpost&pid=16714&ptid=2740][img]http://bbs.bathome.net/images/common/back.gif[/img][/url]
@echo off
set /p var=Please input:
for /f "delims=" %%a in ('^(echo e0:200 "%var%" ff^&more /e +5^ [/quote]
汇编吗?很眼熟的说。

youxi01 发表于 2008-12-8 17:48

[quote]原帖由 [i]随风[/i] 于 2008-12-8 15:15 发表 [url=http://bbs.bathome.net/redirect.php?goto=findpost&pid=16774&ptid=2740][img]http://bbs.bathome.net/images/common/back.gif[/img][/url]
set var=abc  ## adf
这种情况下把#号替换成了空格。 [/quote]
呵呵,只处理 字母 和空格,当初设计的时候
没考虑完全啊

rat 发表于 2008-12-8 19:46

[quote]原帖由 [i]firewolf85[/i] 于 2008-12-8 17:38 发表 [url=http://bbs.bathome.net/redirect.php?goto=findpost&pid=16788&ptid=2740][img]http://bbs.bathome.net/images/common/back.gif[/img][/url]

汇编吗?很眼熟的说。 [/quote]

是。就会一点点而已:(

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!" 
        )                    
)

[[i] 本帖最后由 skuny 于 2009-1-15 19:34 编辑 [/i]]

skuny 发表于 2009-1-15 19:35

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

[[i] 本帖最后由 skuny 于 2009-1-19 11:17 编辑 [/i]]

Batcher 发表于 2009-1-19 13:35

回复 16楼 的帖子

Q: 如何用code把代码扩起来?
A: [url]http://bbs.bathome.net/thread-404-1-1.html[/url]

skuny 发表于 2009-1-21 11:25

回复 17楼 的帖子

括起来后重新编辑出现乱码!![code]@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!"
        )                    
)[/code]

skuny 发表于 2009-1-21 11:27

回复 18楼 的帖子

[code]@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!"
        )                    
)[/code]

jadych 发表于 2009-2-6 09:06

[code]@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[/code]

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
:one
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!

[[i] 本帖最后由 myzwd 于 2009-2-26 13:52 编辑 [/i]]

Batcher 发表于 2009-2-26 14:25

回复 22楼 的帖子

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

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

zqz0012005 发表于 2009-2-26 16:28

[code]@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[/code]

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楼 的帖子

[code]要是改为

pause

mode con cp select=936
cls
exit /b

就完美了[/code]

[[i] 本帖最后由 myzwd 于 2009-2-27 23:05 编辑 [/i]]

keen 发表于 2009-4-1 23:47

[code]@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[/code]

[[i] 本帖最后由 keen 于 2009-4-2 13:17 编辑 [/i]]

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: =#!“是变量扩展吗?他是什么含意
谢谢

页: [1] 2 3

Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.