批量设置变量不保持大小写

时间:2016-02-25 06:31:57

标签: batch-file cmd

我有以下代码和结果,我无法弄清楚为什么第一个字母的大小写没有保留。

代码

 @echo off
    set /P "PrimaryApplicantFirst=Enter First Name: "
    call :toUpperFirst %PrimaryApplicantFirst%
    echo %PrimaryApplicantFirst%
    pause

------------------------------------------------------------------------
:toUpperFirst str
    SETLOCAL ENABLEDELAYEDEXPANSION
    set "name=%~1" 

set first_letter=%name:~0,1%
set last_letters=%name:~1%



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 first_letter=!first_letter:%%#=%%#!
)

set "PrimaryApplicantFirst=%first_letter%%last_letters%"
echo %PrimaryApplicantFirst%

SETLOCAL DISABLEDELAYEDEXPANSION
EXIT /b

输入"测试"将导致

Test
test

为什么会这样?

编辑 - 以下也会产生错误。我错过了什么吗?

:toUpperFirst var
setlocal enableDelayedExpansion
set "name=!%~1!"

set first_letter=%name:~0,1%
set last_letters=%name:~1%

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 first_letter=!first_letter:%%#=%%#!
)

set "PrimaryApplicantFirst=%first_letter%%last_letters%"

endlocal && (
    set "%~1=%PrimaryApplicantFirst%"
)
exit /b %errorlevel%

2 个答案:

答案 0 :(得分:0)

诚实地说,我仍然试图说服自己如何运作。我知道问题在于for循环的行为方式,我想相信变量没有被更新,因为它没有被指定更新。 我想说for-loops像假设的情况一样运行,因为它是逻辑的角色扮演,所以不应该专门记录值。 因此当你键入{{ 1}}在代码的开头而不是在调用时,问题得到纠正。

当我为你的代码which one of my ideas involved arrays.编写替代代码时,就出现了这个解决方案。 (A more indepth version can be veiwed here.)。这些链接详细介绍了有关" DelayedExpansion"变量,是我对这种情况的假设的基础。您是否希望延迟扩展最终代码取决于您自己。以下是仅用于快速复制的更正代码。

SETLOCAL ENABLEDELAYEDEXPANSION

正如您所看到的,大部分代码保持不变,无论第二行是否在运行期间延迟扩展。为什么更改ENABLEDELAYEDEXPANSION的位置可能是因为当你调用代码的其他部分时,你要求它在内部运行延迟扩展而不是从外部运行,因此内部的变量无法传递到外部< / em>的

答案 1 :(得分:0)

:toUpperFirst str
    SETLOCAL ENABLEDELAYEDEXPANSION
    set "name=%~1" 

set first_letter=%name:~0,1%
set last_letters=%name:~1%
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 first_letter=!first_letter:%%#=%%#!
)

set "PrimaryApplicantFirst=%first_letter%%last_letters%"
echo %PrimaryApplicantFirst%

ENDLOCAL&SET "PrimaryApplicantFirst=%PrimaryApplicantFirst%"
EXIT /b

可悲的是,setlocal不是交换机 - 它会调用一个新环境,该环境继承现有环境的设置,并由setlocal命令的任何参数修改。

当执行exit或达到文件的物理结束时,隐式endlocal将应用于打开的上下文本地环境,新的环境将关闭并恢复原始环境。

endlocal%set "var=%var%"结构使用解析技巧。解析行时,任何%var%的值将替换为%var%,然后然后执行该行,因此实际执行的是endlocal&amp; set“var = < EM> thecurrentvalueofvar “