Search code examples
batch-file

Batch - Converting variable to uppercase


How would I go about changing the destl variable to uppercase before it is used. I assume some sort of character swap, however I couldn't get it working. Code is as follows -

@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

I have tried calling something like the following, but could not get it to work -

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

Sorry about the rough code - I'm quite new to this.

Regards,

Joshua


Solution

  • The shortest way (without requiring 3rd party downloads) would be to use PowerShell.

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

    A faster way but still using less code than any pure batch solution would be to employ 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());
    

    And of course, you can easily make either a function so you can call it multiple times as needed.

    @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());
    

    Or if you want to be really hacksy about it, you could abuse the tree command's error message like this:

    @rem toupper.bat
    @echo off & setlocal
    
    if "%~1"=="" (
        echo Usage: %~nx0 "string to make uppercase"
        exit 0
    )
    
    set upper=
    for /f "skip=2 tokens=1* delims=\" %%I in ('tree "\%~1"') do if not defined upper set "upper=%%J"
    echo(%upper%