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

Batch file 批处理-将变量转换为大写,batch-file,cmd,robocopy,Batch File,Cmd,Robocopy,如何在使用前将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 r

如何在使用前将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!
对不起,代码太粗糙了,我对这个很陌生

问候,

约书亚

@ECHO Off
SETLOCAL
设置“betabet=abcdefghijklmnopqrstuvwxyz1234567890!*$^&^^+=-\^^^^^^^>,/?^u:\betabet.file ECHO”!排队!"
端部
电话:showline
ECHO---使用“上插入符号”显示转换
电话:上线
电话:showline
回音------------------------------
ECHO---显示实际文件内容^和从文件读取的数据
键入u:\betabet.file
调用:upcase u:\betabet.file
回音------------------------------
设置“line=abcdefghijklmnopqrstuvwxyz1234567890 |!$%&/\()=?,;:“'.-+*~^^[]{}”
电话:showline
ECHO---使用“内联转换-保留插入符号”显示转换
setlocal ENABLEDELAYEDEXPANSION
对于%%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),请设置“line=!line:%%b=%%b!”

echo“!line!”^这是毫无意义的,因为环境变量名和文件名都不区分大小写。但如果你坚持你可以这样做:

@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%
最短的方法(无需第三方下载)是使用PowerShell

set“str=quickbrownfox”
对于/f“usebackq delims=“%%I in(`powershell'\%str%\”.toUpper()“`)请设置“upper=%%~I”
与任何纯批处理解决方案相比,使用WSH的速度更快,但使用的代码更少

@如果(@code节==@Batch)@那么
@echo off和setlocal
设置“str=敏捷的棕色狐狸”
对于/f“delims=“%%I in('cscript/nologo/e:JScript“%~f0”“%str%”)请设置“upper=%%~I”
占上风
后藤:EOF
@结束//结束批处理/开始JScript混合
Echo(WSH.Arguments(0.toUpperCase());
当然,您可以轻松地创建任意一个函数,以便根据需要多次调用它

@如果(@code节==@Batch)@那么
@echo off和setlocal
呼叫:toUpper Upper 1“敏捷的棕色狐狸”
呼叫:toUpper Upper 2“跳过懒狗”
占上风
后藤:EOF
:图珀
对于/f“delims=“%%I in('cscript/nologo/e:JScript“%~f0”“%~2“),请设置“%~1=%%~I”
后藤:EOF
@结束//结束批处理/开始JScript混合
Echo(WSH.Arguments(0.toUpperCase());

或者,如果您真的想对此进行攻击,您可以滥用
命令的错误消息,如下所示:

@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%
@echo off&setlocal
占上风=
设置“str=使我全部大写!”
对于/f“skip=2 delims=“('tree“\%str%”)中的%%I”,如果未定义上限集,请执行“upper=%%~I”
设置“上限=%upper:~3%”
回显百分比上限%

感谢各位的回复,我用以下方法解决了这个问题-

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
我相信你的回答会更整洁、更有效,但我的回答会很巧妙,我不想破坏任何东西,所以我会保持原样


谢谢你的意见

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

蝙蝠:

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


如果您在Windows上安装了任何POSIX实用程序,就像许多开发人员一样(例如,GNUWin实用程序)

您可以使用tr.exe实用程序,该实用程序有:[:upper:] ----------输出----------


我对great进行了扩展,并将其变成了一个可以在批处理文件中调用的函数

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

这可能是使用批处理文件将字符串转换为大写的最快方法-它使用了,它使用批处理如何替换字符串的方法在循环中仅存储大写字母,并将生成的字符串存储在名为
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%

一个通用的翻译人员,看起来很简单,能够 做这项工作很重要-

@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

您报告的问题与大写转换方法无关,而是与从文件中读取行有关。请尝试以下操作:
set“line=abcdefghijklmnopqrstuvwxyz1234567890”!$%%&/\()=?;:“''+*~^^[]{}”
&
setlocal EnableDelayedExpansion
为%%b in(A b C D E F G H I K L M N O P Q R S T W X Y Z)设置“line=”!行:%%b=%%b!“
&
echo!line!
。在本例中,所有字符都正确转换,即使是
%:*~!
1。这个问题是关于“将变量转换为大写字母”,特别是“destl变量”,因此您的所有代码和解释都是关于“从文件读取数据”“在这里没有意义。你应该在另一个问题中公布这个答案,那是关于“阅读文本文件并将其全部转换为大写”。2.您的编辑只是确认在给定链接上发布的答案是此问题的有效解决方案,因此最好保留我插入的“重复问题”标记(您为了发布此答案而删除了该标记)。最初在处使用的转换代码是这一行:
中的%%b(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)确实设置了“str=!str:%%B=%%B!”
。我还没有测试过它,但是这个纯批处理方法可能和WSH方法一样快,因为加载
cscript.exe
文件的开销。@Aacini查看我的hacksy发现。:)我非常喜欢它<代码>:)+1它甚至可以正确使用西班牙语字符!试试看:
树“\El papáy la mamádel niño güero”
Woah-从未想过滥用
树。略微增强:
for/f“skip=2令牌=1,*delims=\”%%I。。。。做设置“上限=%%J”
您自己找到了最佳解决方案!更整洁的是:对于中的%a(“a=a”“b=b”“c=c”),设置x=!x:%~a!同意这是迄今为止针对cmd.exe(而不是PowerShell)的最佳解决方案,应该位于顶部;这是提出的最小、最丑的黑客,甚至不需要“enabledayedexpansion”。注意:修改变量而不是命令行参数的语法略有不同。我使用了以下方法:(调用set SOME_VARIABLE=%%SOME_VARIABLE:%%~a%%)这太好了,谢谢
Make meeeee all uppercaseeeee! (Old variable)
MAKE MEEEEE ALL UPPERCASEEEEE!
@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%
@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