批处理 - 将变量转换为大写

12

在使用变量 destl 前如何将其转换为大写字母。我认为需要进行字符交换,但我无法使它正常工作。代码如下 -

@echo off
echo.

set /P "destf=Enter First Name: "

set /P "destl=Enter Last Name: "

set "findest=Z:\ProjectIT\copy\%destl%, %destf%"

robocopy Z:\ProjectIT\copy\test "%findest%" /e /NFL /NDL /NJH /NJS

robocopy Z:\ProjectIT\copy\Construction "%findest%"\1-BLANK-%destl% /e /NFL /NDL /NJH /NJS"

echo Construction folder has been created for "%destl%"
echo.

pause

我尝试调用类似以下代码的内容,但是无法使其正常工作 -
:Uppercase
set %~1=!%1:a=A!
set %~1=!%1:b=B!
set %~1=!%1:c=C!
set %~1=!%1:d=D!
set %~1=!%1:e=E!
set %~1=!%1:f=F!
set %~1=!%1:g=G!
set %~1=!%1:h=H!
set %~1=!%1:i=I!
set %~1=!%1:j=J!
set %~1=!%1:k=K!
set %~1=!%1:l=L!
set %~1=!%1:m=M!
set %~1=!%1:n=N!
set %~1=!%1:o=O!
set %~1=!%1:p=P!
set %~1=!%1:q=Q!
set %~1=!%1:r=R!
set %~1=!%1:s=S!
set %~1=!%1:t=T!
set %~1=!%1:u=U!
set %~1=!%1:v=V!
set %~1=!%1:w=W!
set %~1=!%1:x=X!
set %~1=!%1:y=Y!
set %~1=!%1:z=Z!

对于这段粗糙的代码,我很抱歉-我对此还很陌生。

此致敬礼,

乔舒亚


1
也许是这个链接?(http://www.robvanderwoude.com/battech_convertcase.php) - Bloodied
9个回答

23

最短的方法(无需第三方下载)将是使用PowerShell。

set "str=The quick brown fox"
for /f "usebackq delims=" %%I in (`powershell "\"%str%\".toUpper()"`) do set "upper=%%~I"

一种比纯批处理方案更快且代码更少的方法是使用WSH。

@if (@CodeSection == @Batch) @then
@echo off & setlocal

set "str=The quick brown fox"
for /f "delims=" %%I in ('cscript /nologo /e:JScript "%~f0" "%str%"') do set "upper=%%~I"
set upper
goto :EOF

@end // end Batch / begin JScript hybrid
WSH.Echo(WSH.Arguments(0).toUpperCase());

当然,你可以轻松地创建一个函数,这样你就可以根据需要多次调用它。

@if (@CodeSection == @Batch) @then
@echo off & setlocal

call :toUpper upper1 "The quick brown fox"
call :toUpper upper2 "jumps over the lazy dog."
set upper
goto :EOF

:toUpper <return_var> <str>
for /f "delims=" %%I in ('cscript /nologo /e:JScript "%~f0" "%~2"') do set "%~1=%%~I"
goto :EOF

@end // end Batch / begin JScript hybrid
WSH.Echo(WSH.Arguments(0).toUpperCase());

或者,如果您想要真正地搞砸它,您可以像这样滥用 tree 命令的错误消息:


@echo off & setlocal

set upper=
set "str=Make me all uppercase!"
for /f "skip=2 delims=" %%I in ('tree "\%str%"') do if not defined upper set "upper=%%~I"
set "upper=%upper:~3%"
echo %upper%

3
这个答案中最初使用的转换代码可以在此找到:链接,它是这行单独的代码:for %%b 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 "str=!str:%%b=%%b!"。我没有测试过,但很可能这种纯批处理方法与WSH方法的速度一样快,因为加载cscript.exe文件的开销已经去除了。 - Aacini
1
@Aacini,看看我的黑客发现。 :) - rojo
4
我非常喜欢它! :) +1 它甚至能够正确地处理西班牙语字符!尝试: tree "\El papá y la mamá del niño güero" - Aacini
2
哇,从来没有想过滥用 tree 这个东西 +1。稍微改进一下:for /f "skip=2 tokens=1,* delims=\" %%I .... do ... set "upper=%%J" - Stephan

23
感谢大家的回复,我使用以下方法解决了这个问题 -
if not defined %~1 EXIT /b
for %%a 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:%%~a%%
)
EXIT /b

我相信你的回复更整洁、更高效,但是我的方法已经能够起到效果,而且我也不想出现任何差错,所以我会保持原样!谢谢你的建议!

1
你自己找到了最好的解决方案!这样甚至更加简洁:for %a in ("a=A" "b=B" "c=C") do set x=!x:%~a! - Henrik
1
同意这是迄今为止对于 cmd.exe(而非 PowerShell)最好的解决方案,并且应该位于顶部; 它是提出的最小、最少丑陋的 hack,甚至不需要“enabledelayedexpansion”。注意:修改变量而不是命令行参数的语法略有不同。我使用了以下语法:(call set SOME_VARIABLE=%%SOME_VARIABLE:%%~a%%) - byteptr
这太好了,谢谢。希望你不介意,在这个线程中我把它变成了一个函数调用。 - Ste

2
这是毫无意义的,因为环境变量名称和文件名都不区分大小写。但如果你坚持这样做,可以像这样操作:
@echo off

setlocal enabledelayedexpansion
set lower=john smith 123
set alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZ
set i=0
:letter
set !alpha:~%i%,1!_=!alpha:~%i%,1!
set /a i += 1
if %i% LSS 26 goto letter
set i=0
set upper=
:uppercase
set let=!lower:~%i%,1!
if "%let%" == "" goto done
if defined %let%_ (set upper=%upper%!%let%_!) else (set upper=%upper%%let%)
set /a i += 1
goto uppercase
:done
echo %upper%

2
@ECHO Off
SETLOCAL
SET "betabet=abcdefghijklmnopqrstuvwxyz1234567890!*$^&^^+=-\^|^>;'.,/?^<"
ECHO %betabet%
>u:\betabet.file ECHO %betabet%
CALL :upper betabet
ECHO %betabet%
CALL :upcase u:\betabet.file 
GOTO :EOF

:upper
FOR %%a 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 CALL SET "%1=%%%1:%%a=%%a%%%"
GOTO :EOF

:upcase
setlocal EnableDelayedExpansion
for /F "delims=" %%a in (%1) do (
   set "line=%%a"
   for %%b 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 "line=!line:%%b=%%b!"
   )
   echo !line!
)
endlocal
GOTO :eof

Aacini在Windows批处理文件读取文本文件并全部转换为大写的方法中提到的方法对于某些字符失败,在上述批处理程序中有所证明。

如果字符串中包含某些字符(例如%:),则此批处理程序也会失败-它将转换字母,但删除%:

上述批处理程序首先建立一个包含杂项字符的字符串,显示它,保存它为一个文件,然后使用:upper进行转换。

为了比较,该文件随后使用来自链接响应的:upcase函数进行处理。


根据Aacini的有效评论和进一步调查,这里介绍一些技术(包括“从文件读取”的演示)

:showline例程存在以在delayedexpansion模式下显示line来缩短代码。

@ECHO Off
SETLOCAL
set "line=abcdefghijklmnopqrstuvwxyz1234567890|!#$%%&/\()=?<>,;.:"'_-+*~^^[]{}"
SETLOCAL enabledelayedexpansion
>u:\betabet.file ECHO "!line!"
endlocal
CALL :showline
ECHO --- show conversion using "upper - caret disappears
CALL :upper line
CALL :showline
ECHO ------------------------------
ECHO --- show actual file contents ^& data read from file
type u:\betabet.file 
CALL :upcase u:\betabet.file 
ECHO ------------------------------
set "line=abcdefghijklmnopqrstuvwxyz1234567890|!#$%%&/\()=?<>,;.:"'_-+*~^^[]{}"
CALL :showline
ECHO --- show conversion using "inline-conversion - caret PRESERVED
setlocal ENABLEDELAYEDEXPANSION
for %%b 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 "line=!line:%%b=%%b!"
echo "!line!"   ^<--- in inline conversion
endlocal&SET "line=%line:^=^^%"
CALL :showline
ECHO ------------------------------
set "line=abcdefghijklmnopqrstuvwxyz1234567890|!#$%%&/\()=?<>,;.:"'_-+*~^^[]{}"
CALL :showline
ECHO --- show conversion using "upcase2 - caret disappears
CALL :upcase2 line
CALL :showline
GOTO :EOF

:upper
FOR %%a 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 CALL SET "%1=%%%1:%%a=%%a%%%"
GOTO :EOF

:upcase
setlocal EnableDelayedExpansion
for /F "delims=" %%a in (%1) do (
 ECHO read%%a
   set "line=%%a"
   for %%b 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 "line=!line:%%b=%%b!"
   )
   echo conv!line!
)
endlocal
GOTO :eof

:upcase2
setlocal ENABLEDELAYEDEXPANSION
for %%b 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 "%1=!%1:%%b=%%b!"
endlocal&CALL SET "%1=%%%1%%"
GOTO :eof

:showline
SETLOCAL enabledelayedexpansion
ECHO "!line!"
endlocal
GOTO :eof

1
您报告的问题与大写转换方法无关,而是与从文件中读取行有关。请尝试以下操作:set "line=abcdefghijklmnopqrstuvwxyz1234567890|!#$%%&/\()=?<>,;.:"'_-+*~^^[]{}" & setlocal EnableDelayedExpansion & for %%b 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 "line=!line:%%b=%%b!" & echo !line!。在此示例中,所有字符都正确转换,甚至包括 %:*~! - Aacini
  1. 这个问题是关于“将变量转换为大写”,具体来说是关于“destl变量”,因此你的所有代码和解释关于“从文件中读取数据”的内容在这里都是无意义的。 你应该把这个答案发到另一个问题中,那个问题是关于“读取文本文件并全部转换为大写”。
  2. 你的编辑只是确认了给定链接中发布的答案是这个问题的一个可行解决方案,所以最好保留我插入的“重复的问题”标记(你为了发表这个答案而移除了它)。
- Aacini

1

一个看起来简单而且能胜任工作的通用翻译器是 -

@echo off
call:@translate WhIiPpiTy abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ
echo %_answer%
call:@translate "12:37 am" apm APM
echo %_answer%
pause
exit  /b
:@translate
setlocal
set j=%~1
set f=%~2
set t=%~3
set x=0
:translate_loop
call set r=%%f:~%x%,1%%=%%t:~%x%,1%%
call set j=%%j:%r%%%  >NUL 2>&1
if %ERRORLEVEL%==1 goto translate_end
set /a x+=1
goto translate_loop
:translate_end
endlocal & set _answer=%j%
exit /b

0

这可能是使用批处理文件将字符串转换为大写的最快方法 - 它使用一个,在循环中仅存储大写字母,使用批处理替换字符串的方式并将生成的字符串存储在名为result的变量中:

@echo off

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

echo %result%

0

我使用了2个文件,在批处理中调用了一个外部js,在bat中将响应分配给内部变量:

Bat:

@echo off
for /f %%i in ('cscript //nologo //E:jscript jsfile.js %1') do set VAR=%%i
echo %Var%

Js(同一目录中的jsfile.js):

WScript.echo(WSH.Arguments(0).toUpperCase())

0

如果你在Windows上安装了任何POSIX实用工具,像很多开发者一样(例如GNUWin实用工具,https://sourceforge.net/projects/gnuwin32/

你可以使用tr.exe实用工具,它包含:[:upper:]

@echo off
SETLOCAL EnableDelayedExpansion
echo Before: SCEINST is: %SCEINST%
set upper=
for /f "usebackq delims=" %%g in (`echo %SCEINST% ^| tr [:lower:] [:upper:]`) do (
    SET upper=%%g
    :: get rid of any leading whitespace
    set upper=!upper: =!
    goto :done
)
:done
echo After: SCEINST (in upper) is now: !upper!

----------输出----------

Before: SCEINST is: scprd
After: SCEINST (in upper) is now: SCPRD

0
我对原帖中 OP的回答进行了扩展,并将其制作成一个可以在整个批处理文件中调用的函数。
@echo off

set "str=Make meeeee all uppercaseeeee!"
echo %str% (Old variable)
call :TOUPPERCASE str
echo %str%
goto :eof

rem FUNCTIONS AT VERY BOTTOM
:TOUPPERCASE
if not defined %~1 exit /b
for %%a 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:%%~a%%
)
goto :eof

结果

Make meeeee all uppercaseeeee! (Old variable)
MAKE MEEEEE ALL UPPERCASEEEEE!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接