Сделать переменную в нижнем регистре в партии без вызова - PullRequest
3 голосов
/ 26 мая 2020

Вот код, который я нашел для преобразования значения в нижний регистр, но мне было любопытно, как это сделать без CALL и просто использовать переменную:

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

Ответы [ 4 ]

6 голосов
/ 26 мая 2020

Я не уверен, какого вызова вы хотите избежать - вызова для l oop или вызова подпрограммы. Но можно отказаться от обоих, используя macro и delayedExpansion , которые будут выполняться намного быстрее:

@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%

Также из-за того, как работает замена в пакетных файлах вы можете просто указать строчные буквы - это также повысит производительность. Вероятно, приведенный выше код - это самый быстрый способ установить строку в нижнем регистре только в пакетном файле.

5 голосов
/ 26 мая 2020

Если вы вообще не используете sh Call, преобразуйте функцию в макрос. Вот макрос, который может преобразовывать верхнее или нижнее

@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
1 голос
/ 27 мая 2020

Достаточно просто использовать функцию ToLower () в PowerShell. Если вы используете поддерживаемую платформу Windows, PowerShell доступен. Он работает на Linux и Ma c.

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

Если это входит в сценарий файла .bat, удвойте символ PERCENT в переменной FOR l oop.

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

Он обработает строку, содержащую символ QUOTATION MARK.

C:\src\t>SET "STRING=Now Is ""The Time"
C:\src\t>FOR /F "delims= eol=" %A IN ('powershell -NoLogo -NoProfile -Command "'%STRING%'.ToLower()"') DO (SET "STRING2=%~A")
C:\src\t>(SET "STRING2=now is "the time" )
C:\src\t>SET STRING
STRING=Now Is ""The Time
STRING2=now is "the time

Если код написан в PowerShell, это может быть:

$String = "Hello, how are you?".ToLower()
Write-Output $String
0 голосов
/ 19 июня 2020

DIR /L работает для всех имен файлов , даже Unicode, например ÁCCÉNTS .

Макрос $lower определяется как:

set ^"$lower=(dir/l/b/o-d "%TEMP%"^|"%ComSpec%" /v/c"set/plower=&echo(!lower!") 9^>\\?\"%TEMP%"\"

, где DELAYEDEXPANSION должно быть ОТКЛЮЧЕНО .

Демонстрационный скрипт:

@echo off
chcp 65001 >nul
====SETLOCAL DisableDelayedExpansion EnableExtensions


set "PATH="
set "DPATH="
set "PATHEXT=;"
set ^"$lower=(dir/l/b/o-d "%TEMP%"^|"%ComSpec%" /v/c"set/plower=&echo(!lower!") 9^>\\?\"%TEMP%"\"


echo START: %time%
%$lower%"Hello, how are you"
%$lower%"I print a string (VALID FILENAME) in lower case"
%$lower%"ABCDEFGHIIJKLMNOPQRSTUVWXYZ"
%$lower%"GreekΘ&Áccents work"
%$lower%"ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ"
%$lower%"µÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßĀĂĄĆĈĊČĎĐĒĔĖĘĚĜĞĠĢĤĦĨĪĬĮİİIJĴĶĹĻĽĿŁŃŅŇʼnŊŌŎŐŒŔŖŘŚŜŞŠŢŤŦŨŪŬŮŰŲŴŶŸŹŻŽ"
%$lower%"   SPA        CES "
%$lower%"EXCLAMS!!!"
%$lower%";SEMICOLONS all work"
%$lower%"SADLY ILLEGAL FILENAMES DON'T"
%$lower%"\/:*?<>|"
echo END: %time%
...