Aquí hay un código que encontré para poner un valor en minúsculas, pero tenía curiosidad de cómo hacerlo sin la LLAMADA y simplemente usar una variable:

SET String=Hello, how are you ?
CALL :LoCase String
:LoCase
FOR %%i 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:%%~i%%"
GOTO:EOF
3
epickmatt 26 may. 2020 a las 18:49

3 respuestas

La mejor respuesta

No estoy seguro de qué llamada desea evitar: la del bucle for o la llamada a la subrutina. Pero es posible deshacerse de ambos con macro y demoyedExpansion, que se ejecutará mucho más rápido:

@echo off

set locase=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 "
%locase%%string%

echo %result%

Además, debido a la forma en que funciona el reemplazo en los archivos por lotes, solo puede enumerar las letras minúsculas; esto también aumentará el rendimiento. Probablemente el código anterior sea la forma más rápida posible de establecer cadenas en minúsculas solo en archivos por lotes.

4
npocmaka 26 may. 2020 a las 18:11

Es bastante fácil usar la función ToLower () en PowerShell. Si está en una plataforma Windows compatible, PowerShell está disponible. Se ejecuta en Linux y Mac.

SET "STRING=Hello, how are you ?"
FOR /F "delims=" %A IN ('powershell -NoLogo -NoProfile -Command "'%STRING%'.ToLower()"') DO (SET "STRING=%~A")
ECHO STRING is now === %STRING%

Si esto entra en un script de archivo .bat, duplique el carácter PERCENT en la variable de bucle FOR.

SET "STRING=Hello, how are you ?"
FOR /F "delims=" %%A IN ('powershell -NoLogo -NoProfile -Command "'%STRING%'.ToLower()"') DO (SET "STRING=%%~A")
ECHO STRING is now === %STRING%

Si el código está escrito en PowerShell, podría ser:

$String = "Hello, how are you ?".ToLower()
Write-Output $String
0
lit 27 may. 2020 a las 14:10

Si no desea utilizar Llamar, convierta la función a una macro. Aquí hay una macro que puede convertir arriba o abajo

@ECHO OFF  
    Setlocal DisableDelayedExpansion

    (Set LF=^


    %= Above Empty lines Required =%)

    Set ^"\n=^^^%LF%%LF%^%LF%%LF%^^"

    Set CASE=For %%n in (1 2) Do IF %%n==2 (%\n%
        For /F "Tokens=1,2 Delims=, " %%G in ("!CONVERT!") Do (%\n%
            IF /I "%%H" == "u" For %%x 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 "%%~G=!%%~G:%%x=%%x!")%\n%
            IF /I "%%H" == "l" For %%x 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 "%%~G=!%%~G:%%x=%%x!")%\n%
        )%\n%
    ) Else Set CONVERT=,

    Setlocal EnableDelayedExpansion  
:Loop
    Set /P "String=String: "
    %CASE% String u
    Echo.!String!
    %CASE% String l
    Echo.!String!
Goto :Loop
3
T3RR0R 27 may. 2020 a las 20:04