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)
我不确定您要避免哪个调用 - 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)
同样由于替换在批处理文件中的工作方式,您可以只列出小写字母 - 这也将提高性能。上面的代码可能是仅在批处理文件中以小写形式设置字符串的最快方法。
如果您根本不想使用 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)
| 归档时间: |
|
| 查看次数: |
762 次 |
| 最近记录: |