代码之家  ›  专栏  ›  技术社区  ›  Joshua Patterson

Batch-将变量转换为大写

  •  12
  • Joshua Patterson  · 技术社区  · 9 年前

    我该如何改变 目标 变量设置为大写。我想换一种角色,但我没能成功。代码如下-

    @echo off
    echo.
    
    set /P "destf=Enter First Name: "
    
    set /P "destl=Enter Last Name: "
    
    set "findest=Z:\ProjectIT\copy\%destl%, %destf%"
    
    robocopy Z:\ProjectIT\copy\test "%findest%" /e /NFL /NDL /NJH /NJS
    
    robocopy Z:\ProjectIT\copy\Construction "%findest%"\1-BLANK-%destl% /e /NFL /NDL /NJH /NJS"
    
    echo Construction folder has been created for "%destl%"
    echo.
    
    pause
    

    我试过拨打以下电话,但无法正常工作-

    :Uppercase
    set %~1=!%1:a=A!
    set %~1=!%1:b=B!
    set %~1=!%1:c=C!
    set %~1=!%1:d=D!
    set %~1=!%1:e=E!
    set %~1=!%1:f=F!
    set %~1=!%1:g=G!
    set %~1=!%1:h=H!
    set %~1=!%1:i=I!
    set %~1=!%1:j=J!
    set %~1=!%1:k=K!
    set %~1=!%1:l=L!
    set %~1=!%1:m=M!
    set %~1=!%1:n=N!
    set %~1=!%1:o=O!
    set %~1=!%1:p=P!
    set %~1=!%1:q=Q!
    set %~1=!%1:r=R!
    set %~1=!%1:s=S!
    set %~1=!%1:t=T!
    set %~1=!%1:u=U!
    set %~1=!%1:v=V!
    set %~1=!%1:w=W!
    set %~1=!%1:x=X!
    set %~1=!%1:y=Y!
    set %~1=!%1:z=Z!
    

    对粗略的代码表示抱歉-我对这个很陌生。

    当做

    约书亚

    9 回复  |  直到 9 年前
        1
  •  23
  •   rojo    9 年前

    最短的方法(不需要第三方下载)是使用PowerShell。

    set "str=The quick brown fox"
    for /f "usebackq delims=" %%I in (`powershell "\"%str%\".toUpper()"`) do set "upper=%%~I"
    

    使用WSH是一种比任何纯批处理解决方案更快但仍然使用更少代码的方法。

    @if (@CodeSection == @Batch) @then
    @echo off & setlocal
    
    set "str=The quick brown fox"
    for /f "delims=" %%I in ('cscript /nologo /e:JScript "%~f0" "%str%"') do set "upper=%%~I"
    set upper
    goto :EOF
    
    @end // end Batch / begin JScript hybrid
    WSH.Echo(WSH.Arguments(0).toUpperCase());
    

    当然,你可以很容易地制作一个函数,这样你就可以 call 根据需要进行多次。

    @if (@CodeSection == @Batch) @then
    @echo off & setlocal
    
    call :toUpper upper1 "The quick brown fox"
    call :toUpper upper2 "jumps over the lazy dog."
    set upper
    goto :EOF
    
    :toUpper <return_var> <str>
    for /f "delims=" %%I in ('cscript /nologo /e:JScript "%~f0" "%~2"') do set "%~1=%%~I"
    goto :EOF
    
    @end // end Batch / begin JScript hybrid
    WSH.Echo(WSH.Arguments(0).toUpperCase());
    

    或者,如果你真的想对此大发雷霆,你可以滥用 tree 命令的错误消息如下:

    @echo off & setlocal
    
    set upper=
    set "str=Make me all uppercase!"
    for /f "skip=2 delims=" %%I in ('tree "\%str%"') do if not defined upper set "upper=%%~I"
    set "upper=%upper:~3%"
    echo %upper%
    
        2
  •  19
  •   Joshua Patterson    9 年前

    谢谢大家的回复,我用这个解决了-

    if not defined %~1 EXIT /b
    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" "ä=Ä"
            "ö=Ö" "ü=Ü") do (
    call set %~1=%%%~1:%%~a%%
    )
    EXIT /b
    

    我相信你的回答会更加整洁和高效,但由于我正在做这个把戏,我不想破坏任何东西,所以我会保持原样!

    感谢您的输入!

        3
  •  2
  •   Community T.Woody    7 年前
    @ECHO Off
    SETLOCAL
    SET "betabet=abcdefghijklmnopqrstuvwxyz1234567890!*$^&^^+=-\^|^>;'.,/?^<"
    ECHO %betabet%
    >u:\betabet.file ECHO %betabet%
    CALL :upper betabet
    ECHO %betabet%
    CALL :upcase u:\betabet.file 
    GOTO :EOF
    
    :upper
    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 CALL SET "%1=%%%1:%%a=%%a%%%"
    GOTO :EOF
    
    :upcase
    setlocal EnableDelayedExpansion
    for /F "delims=" %%a in (%1) do (
       set "line=%%a"
       for %%b 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 "line=!line:%%b=%%b!"
       )
       echo !line!
    )
    endlocal
    GOTO :eof
    

    Aacini在 Windows batch file read text file and convert all to uppercase 对于某些字符失败,如上面的批次所示。

    如果有问题的字符串包含某些字符(例如 %: )-它将转换字母,但删除 % : .

    上述批处理首先建立一个包含各种字符的字符串,显示它,将其保存为文件,然后使用 :upper .

    为了进行比较,然后使用 :upcase 函数(源自链接的响应)。


    根据Aacini的有效评论和进一步调查,以下是一些技巧(包括“从文件读取”方法的演示)

    这个 :showline 存在通过显示来缩短代码的例程 line 在里面 延迟扩展 模式

    @ECHO Off
    SETLOCAL
    set "line=abcdefghijklmnopqrstuvwxyz1234567890|!#$%%&/\()=?<>,;.:"'_-+*~^^[]{}"
    SETLOCAL enabledelayedexpansion
    >u:\betabet.file ECHO "!line!"
    endlocal
    CALL :showline
    ECHO --- show conversion using "upper - caret disappears
    CALL :upper line
    CALL :showline
    ECHO ------------------------------
    ECHO --- show actual file contents ^& data read from file
    type u:\betabet.file 
    CALL :upcase u:\betabet.file 
    ECHO ------------------------------
    set "line=abcdefghijklmnopqrstuvwxyz1234567890|!#$%%&/\()=?<>,;.:"'_-+*~^^[]{}"
    CALL :showline
    ECHO --- show conversion using "inline-conversion - caret PRESERVED
    setlocal ENABLEDELAYEDEXPANSION
    for %%b 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 "line=!line:%%b=%%b!"
    echo "!line!"   ^<--- in inline conversion
    endlocal&SET "line=%line:^=^^%"
    CALL :showline
    ECHO ------------------------------
    set "line=abcdefghijklmnopqrstuvwxyz1234567890|!#$%%&/\()=?<>,;.:"'_-+*~^^[]{}"
    CALL :showline
    ECHO --- show conversion using "upcase2 - caret disappears
    CALL :upcase2 line
    CALL :showline
    GOTO :EOF
    
    :upper
    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 CALL SET "%1=%%%1:%%a=%%a%%%"
    GOTO :EOF
    
    :upcase
    setlocal EnableDelayedExpansion
    for /F "delims=" %%a in (%1) do (
     ECHO read%%a
       set "line=%%a"
       for %%b 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 "line=!line:%%b=%%b!"
       )
       echo conv!line!
    )
    endlocal
    GOTO :eof
    
    :upcase2
    setlocal ENABLEDELAYEDEXPANSION
    for %%b 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 "%1=!%1:%%b=%%b!"
    endlocal&CALL SET "%1=%%%1%%"
    GOTO :eof
    
    :showline
    SETLOCAL enabledelayedexpansion
    ECHO "!line!"
    endlocal
    GOTO :eof
    
        4
  •  2
  •   Henrik    9 年前

    这是没有意义的,因为env变量名和文件名都不区分大小写。但如果你坚持你可以这样做:

    @echo off
    
    setlocal enabledelayedexpansion
    set lower=john smith 123
    set alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZ
    set i=0
    :letter
    set !alpha:~%i%,1!_=!alpha:~%i%,1!
    set /a i += 1
    if %i% LSS 26 goto letter
    set i=0
    set upper=
    :uppercase
    set let=!lower:~%i%,1!
    if "%let%" == "" goto done
    if defined %let%_ (set upper=%upper%!%let%_!) else (set upper=%upper%%let%)
    set /a i += 1
    goto uppercase
    :done
    echo %upper%
    
        5
  •  1
  •   Forest    4 年前

    一个看起来简单且能够 做的工作是-

    @echo off
    call:@translate WhIiPpiTy abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ
    echo %_answer%
    call:@translate "12:37 am" apm APM
    echo %_answer%
    pause
    exit  /b
    :@translate
    setlocal
    set j=%~1
    set f=%~2
    set t=%~3
    set x=0
    :translate_loop
    call set r=%%f:~%x%,1%%=%%t:~%x%,1%%
    call set j=%%j:%r%%%  >NUL 2>&1
    if %ERRORLEVEL%==1 goto translate_end
    set /a x+=1
    goto translate_loop
    :translate_end
    endlocal & set _answer=%j%
    exit /b
    
        6
  •  0
  •   cbeltrangomez    6 年前

    我使用了两个文件,在批处理中我调用了一个外部js,在bat中我将响应分配给一个内部var:

    蝙蝠:

    @echo off
    for /f %%i in ('cscript //nologo //E:jscript jsfile.js %1') do set VAR=%%i
    echo %Var%
    

    Js(同一目录中的jsfile.Js):

    WScript.echo(WSH.Arguments(0).toUpperCase())
    
        7
  •  0
  •   Darrin    5 年前

    如果您在Windows上安装了任何POSIX实用程序,就像许多开发人员一样(例如 https://sourceforge.net/projects/gnuwin32/ )

    您可以使用tr.exe实用程序,它具有:[:upper:]

    @echo off
    SETLOCAL EnableDelayedExpansion
    echo Before: SCEINST is: %SCEINST%
    set upper=
    for /f "usebackq delims=" %%g in (`echo %SCEINST% ^| tr [:lower:] [:upper:]`) do (
        SET upper=%%g
        :: get rid of any leading whitespace
        set upper=!upper: =!
        goto :done
    )
    :done
    echo After: SCEINST (in upper) is now: !upper!
    

    ----------输出,输出----------

    Before: SCEINST is: scprd
    After: SCEINST (in upper) is now: SCPRD
    
        8
  •  0
  •   Ste    5 年前

    我扩展了伟大的 answer by the OP 并使其成为一个可以在整个批处理文件中调用的函数。

    @echo off
    
    set "str=Make meeeee all uppercaseeeee!"
    echo %str% (Old variable)
    call :TOUPPERCASE str
    echo %str%
    goto :eof
    
    rem FUNCTIONS AT VERY BOTTOM
    :TOUPPERCASE
    if not defined %~1 exit /b
    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" "ä=Ä" "ö=Ö" "ü=Ü") do (
    call set %~1=%%%~1:%%~a%%
    )
    goto :eof
    

    后果

    Make meeeee all uppercaseeeee! (Old variable)
    MAKE MEEEEE ALL UPPERCASEEEEE!
    
        9
  •  0
  •   npocmaka    4 年前

    这可能是使用批处理文件将字符串转换为大写的最快方法-它使用 macro ,它使用批处理替换字符串的方式在循环中仅存储大写字母,并将生成的字符串存储在名为 result :

    @echo off
    
    set UpperCaseMacro=for /L %%n in (1 1 2) do if %%n==2 (for %%# 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 "result=!result:%%#=%%#!") else setlocal enableDelayedExpansion ^& set result=
    
    set "string=SOme STrinG WiTH lowerCAse letterS and UPCase leTTErs"
    %UpperCaseMacro%%string%
    
    echo %result%