批量使变量全部小写,无需调用

epi*_*att 4 windows cmd batch-file

这是我发现的一个使值小写的代码,但很好奇如何在没有 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
Run Code Online (Sandbox Code Playgroud)

npo*_*aka 7

我不确定您要避免哪个调用 - for 循环中的调用或调用子例程。但是可以同时使用延迟扩展,它们的执行速度会快得多:

@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%
Run Code Online (Sandbox Code Playgroud)

同样由于替换在批处理文件中的工作方式,您可以只列出小写字母 - 这也将提高性能。上面的代码可能是仅在批处理文件中以小写形式设置字符串的最快方法。

  • 它需要一个小的修改 npocmaka,它应该是 `%locase%%string%`,否则你将引入一个额外的前导空格字符!另外,就我个人而言,我会将 `for /L %%n in (1 1 2) do if %%n==2` 更改为稍短的 `for %%n in (1 2) do if %%n equ 2`,或`for %%n in (1 2) do if %%n==2`,或`for %%n in (1 2) do if %%n gtr 1` (4认同)
  • 不错的解决方案,仍然觉得值得添加额外的循环来处理并将字符串返回到原始变量名称 (2认同)

T3R*_*R0R 6

如果您根本不想使用 Call,请将函数转换为宏。这是一个可以转换上限或下限的宏

@ECHO OFF & Setlocal DISABLEDelayedExpansion
(Set \n=^^^
%=Do Not Modify=%
)
(Set LF=^


%=Do Not Modify=%)
 Set CASE=For %%n in (1 2) Do IF %%n==2 (%\n%
  Set "Switch=?"%\n%
  If not "[?]" == "[!Sub!]" (%\n%
   If "!String!" == "" Echo/No args Input. %%Case:?=!Switch!%%!String!!LF! !Usage!%\n%
   For /F "Tokens=1,2 Delims={}" %%G in ("!String!")Do If not "%%~H" == "" (%\n%
    Set "String=%%~H"%\n%
    Set "upper=!Switch:-u=!" ^& If Not "!upper!" == "!switch!" 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 "String=!String:%%x=%%x!")%\n%
    Set "lower=!Switch:-l=!" ^& If Not "!lower!" == "!switch!" 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 "String=!String:%%x=%%x!")%\n%
    Set "supress=!Switch:-s=!" ^& If "!supress!" == "!switch!" Echo/!String!%\n%
    Set "%%~G=!String!"%\n%
   ) Else Echo Missing Arg. %%Case:?=!Switch!%%{%%G}{%%H}!LF! !Usage!%\n%
  ) Else echo/Substring Switch required. %%Case:?=!Switch!%%!String!!LF! !Usage!%\n%
 ) Else Set String=
 Set "SUB=?"
 Set "Usage=Usage: %%CASE:?=[-U|-L]{-S}%%{ReturnVar}{Input String}"
Setlocal ENABLEDelayedExpansion
rem /* usage examples */
 Set /P "iString=String: "
rem /* convert upper */
 %CASE:?=-u%{string.upper}{!iString!}
rem /* convert lower; suppress output */
 %CASE:?=-l -s%{string.lower}{!iString!}
rem /* Demonstrate Macro error handling */
 %CASE:?=-l%
 %CASE%{string.noswitch}{!iString!}
 %CASE:?=-l%{String.false}
 Set string.
Run Code Online (Sandbox Code Playgroud)