我有以下代码和结果,我无法弄清楚为什么第一个字母的大小写没有保留。
代码
@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%
答案 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 “