How to convert the value of %USERNAME% to lowercase within a Windows batch script?

后端 未结 9 571
暗喜
暗喜 2020-12-09 17:10

I\'m automating some source control software functionality using a dot bat script but given that our svn repos are hosted in a *NIX box, I\'m facing the eternal case problem

相关标签:
9条回答
  • 2020-12-09 17:14

    When a scripting language is installed then that can be used with a "FOR" to set a variable.

    Any scripting language can be used if it can convert a string to lowercase and output the result.

    An example using Perl 5 :

    @FOR /F %%s IN ('perl -e "print lc(pop)" %USERNAME%') DO @set USERNAME=%%s
    

    An example using PowerShell :

    @FOR /F %%s IN ('powershell -command "(get-item env:'USERNAME').Value.ToLower()"') DO @set USERNAME=%%s
    

    These days, odds are that PowerShell is already installed by default.

    0 讨论(0)
  • http://www.dzone.com/snippets/lowercasing-string-bat-files

    lower.bat

    echo>%1
    dir /b/l %1>lower.tmp
    set /p result=<lower.tmp
    echo %result%
    

    cmd

    lower "Mein BinnenMajuskel"
    

    result

    mein binnenmajuskel
    

    CAUTION: Quick & dirty, but also insecure and dangerous variant. Because you create two files. One called like the given string and another called lower.tmp, which contains the lowered string. What happens if you execute lower "UserName" in a directory, where this file or directory already exists? Especially if you delete this files afterwards ...

    Improved version:

    echo>%Temp%\%1
    dir /b/l %Temp%\%1>%Temp%\lower.tmp
    set /p result=<%Temp%\lower.tmp
    del %Temp%\%1
    del %Temp%\lower.tmp
    
    0 讨论(0)
  • 2020-12-09 17:23

    a quick google found this...

    @echo off
    goto :end_remarks
    *************************************************************************************
    *
    *
    *    authored:Sam Wofford
    *    Returns lowercase of a string
    *    12:13 PM 11/13/02
    **************************************************************************************
    :end_remarks
    setlocal
    set errorlevel=-1
    if {%1}=={} echo NO ARG GIVEN&call :Help &goto :endit
    if {%1}=={/?} call :Help &goto :endit
    call :set_LCASE_array 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
    
    :start
    set input=%1
    set input=%input:"=%
    set totparams=0
    call :COUNT_PARAMS %input%
    call :MAKE_LOWERCASE %input%
    set errorlevel=
    echo %convertedstring%
    endlocal
    goto :eof
    :endit
    echo %errorlevel%
    endlocal
    goto :eof
    
    :MAKE_LOWERCASE
    :nextstring
    if {%1}=={} goto :eof
    set string=%1
    set /a params+=1
    set STRINGCONVERTED=
    set pos=0
    :NEXT_CHAR
    set onechar=%%string^:^~%pos%,1%%
    for /f "tokens=1,2 delims==" %%a in ('set onechar') do for /f %%c in ('echo %%b') do call :checkit %%c
    if not defined STRINGCONVERTED goto :NEXT_CHAR
    shift /1
    if %params% LSS %totparams% set convertedstring=%convertedstring% &:add one space,but not at end
    goto :nextstring
    goto :eof
    
    :Help
    echo USAGE:%~n0 string OR %~n0 "with spaces"
    echo function returns the lowercase of the string or -1 (error)
    echo strings with embedded spaces needs to be in quotes Ex. "lower case"
    echo in a batch NTscript "for /f %%%%A in ('lcase STRING') do set var=%%%%A"
    set errorlevel=
    goto :eof
    
    :checkit
    set LCFOUND=
    if /i {%1}=={echo} set STRINGCONVERTED=Y&goto :eof
    set char=%1
    for /f "tokens=2 delims=_=" %%A in ('set LCASE_') do call :findit %%A %char%
    :skipit
    if defined LCFOUND (set convertedstring=%convertedstring%%ucletter%) else (set convertedstring=%convertedstring%%char%)
    set /a pos+=1
    goto :eof
    
    :set_LCASE_array
    :setit
    if {%1}=={} goto :eof
    set LCASE_%1_=%1
    SHIFT /1
    goto :setit
    
    :findit
    if defined LCFOUND goto :eof
    set ucletter=%1
    set lcchar=%2
    if /i {%ucletter%}=={%lcchar%} set LCFOUND=yes
    goto :eof
    
    :COUNT_PARAMS
    :COUNTPARAMS
    if {%1}=={} goto :eof
    set /a totparams+=1
    shift /1
    goto :COUNTPARAMS 
    

    add that as a file (lowercase.cmd) to your path and you should be able to call it as "Lowercase.cmd %Username%", you could pipe it into another command if needed.

    0 讨论(0)
  • 2020-12-09 17:26

    download some unix utilities for DOS from http://short.stop.home.att.net/freesoft/unix.htm and use tr.exe (translate characters)

    echo %USERNAME% | tr "[A-Z]" "[a-z]" 
    

    I also use a DOS extended cmd replacement named 4NT which has a built in command @lower

    echo %@lower[%USERNAME%]
    
    0 讨论(0)
  • 2020-12-09 17:26

    Probably this is the fastest way to convert a string to lowercase in batch file as it uses macro and there are no temp files (it saves the produced string in variable called result):

    @echo off
    
    set LowerCaseMacro=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"
    %LowerCaseMacro%%string%
    
    echo %result%
    
    0 讨论(0)
  • 2020-12-09 17:28

    Well, I was browsing for some syntax and stumbled upon this page. I know its old but I thought I'd take a break and give the brain a little kick.

    Here's something a little shorter and manageable. This just "brute forces" all uppercase letters to lowercase letters without regards to whether the actual letter exists in the string or not. Thus the functional loop runs exactly 26 times no matter the length of the string.

    Hope this helps someone.

    @echo off
    cls
    setlocal enabledelayedexpansion
    
    REM ***** Modify as necessary for the string source. *****
    set "_STRING=%*"
    if not defined _STRING set "_STRING=%USERNAME%"
    set _STRING
    REM ***** Modify as necessary for the string source. *****
    
    set "_UCASE=ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    set "_LCASE=abcdefghijklmnopqrstuvwxyz"
    
    for /l %%a in (0,1,25) do (
       call set "_FROM=%%_UCASE:~%%a,1%%
       call set "_TO=%%_LCASE:~%%a,1%%
       call set "_STRING=%%_STRING:!_FROM!=!_TO!%%
    )
    
    set _STRING
    endlocal
    

    Example:

    E:\OS.ADMIN>LCASE.BAT The Quick Fox Jumps Over The Brown Fence.
    

    Result:

    _STRING=The Quick Fox Jumps Over The Brown Fence.
    _STRING=the quick fox jumps over the brown fence.
    
    0 讨论(0)
提交回复
热议问题