Batch file 批处理集变量不包含大小写

Batch file 批处理集变量不包含大小写,batch-file,cmd,Batch File,Cmd,我有下面的代码和结果,我无法理解为什么第一个字母的大小写不正确 代码 输入“测试”将导致 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

我有下面的代码和结果,我无法理解为什么第一个字母的大小写不正确

代码

输入“测试”将导致

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%

老实说,我仍在试图说服自己它是如何工作的。我知道问题在于for循环的行为,我想相信变量没有被更新,因为它没有被指定更新我想说的是,for循环像一个假设的情况一样运行,不应该专门记录值,因为这是逻辑的角色扮演。因此,当您在代码的开头键入
SETLOCAL ENABLEDELAYEDEXPANSION
而不是调用它时,问题就得到了纠正

这个解决方案是在我为您编写替代代码时出现的。(). 这些链接详细介绍了关于“DelayedExpansion”变量的信息,是我对这种情况进行假设的基础。您是否希望在最终代码中延迟扩展取决于您自己。以下是更正后的代码,仅供快速复制

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

------------------------------------------------------------------------
:toUpperFirst str
    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
如您所见,大部分代码保持不变,而忽略了第二行代码,即运行期间延迟的扩展。之所以更改ENABLEDELAYEDEXPANSION的位置,可能是因为当您调用代码的其他部分时,您要求它在内部而不是外部运行延迟的扩展,以便内部的变量无法传递到外部

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(
设置首字母=!首字母:%%首字母=%%!
)
设置“PrimaryApplicationFirst=%first\u letter%%last\u letters%”
回显%PrimaryApplicationFirst%
ENDLOCAL&设置“PrimaryApplicationFirst=%PrimaryApplicationFirst%”
退出/b
遗憾的是,
setlocal
不是一个开关-它调用一个新的环境,该环境继承现有环境的设置,并通过
setlocal
命令的任何参数进行修改

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


endlocal%集“var=%var%”
结构使用解析技巧。当解析该行时,任何
%var%
的值都被替换为
%var%
,然后执行该行,因此实际执行的是endlocal&set“var=thecurrentvalueofvar”

SETLOCAL DISABLEDELAYEDEXPANSION
endlocal&set“primaryapplicationfirst=%primaryapplicationfirst%”因为有
setlocal
作用域。您需要同时使用
endlocal
和设置变量值,这可以通过
实现,就像在PetSerAl注释中一样。请检查您的答案以了解更多详细信息。@JoshuaPatterson您的更新版本对我来说很好。希望,不要忘记更新
调用
指令。
 @echo off
SETLOCAL ENABLEDELAYEDEXPANSION
    set /P "PrimaryApplicantFirst=Enter First Name: "
    call :toUpperFirst %PrimaryApplicantFirst%
    echo %PrimaryApplicantFirst%
    pause

------------------------------------------------------------------------
:toUpperFirst str
    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
:toUpperFirst str
    SETLOCAL ENABLEDELAYEDEXPANSION
    set "name=%~1" 

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