我有一个*.bat
应该登录到服务器的批处理 ( ) 文件。这些是其中的几行:
set /P token_user=": SAS token account (srvglobalff...) :"
echo token user is %token_user%
set /p proceed="Proceed with these parameters? (Execute, Cancel) :"
rem If "Execute" selected, apply all
if /i %proceed:~0,1%==E (
set /P profile="sas-admin profile:"
echo profile is %profile%, token_user_is %token_user%
do_stuff --profile %profile%
more_stuff --account %token_user%
如果我运行它并输入token_1
and profile_1
,它会回显
profile is , token_user_is token_1
如果我再次运行它并输入token_2
and profile_2
,它会回显
profile is profile_1, token_user_is token_2
什么解释了这一点,我该如何治愈它?
这个问题并不完全清楚,应该改进。
变量的实际值将在
set
命令后立即更改。问题源于 CMD 在执行脚本时扩展变量的时间点。当 Windows CMD 处理此
if
语句时它将在执行完整语句之前扩展所有变量,例如该行
将使用语句之前定义的
profile
和的值。token_user
if
您的代码需要
%profile%
在echo
命令中使用之前在set /P profile=...
同一if
语句中输入的值进行扩展。为此,您需要使用!profile!
而不是延迟扩展%profile%
。要使用延迟扩展,必须使用setlocal enabledelayedexpansion
.修改后的脚本
在问题的示例中,延迟扩展仅对
profile
. 如果您不想更改语句token_user
内部的值,if
则不需要!token_user!
对此变量进行延迟扩展(),但它也适用于