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%