我有一个批处理 ( *.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
并profile_1
,它会回显
profile is , token_user_is token_1
如果我再次运行它并输入token_2
并profile_2
,它会回显
profile is profile_1, token_user_is token_2
这该如何解释?我该如何治愈?
答案1
问题没有完全解释清楚,有待改进。
变量的实际值在set
命令执行后会立即改变。问题出在 CMD 在执行脚本时扩展变量的时间点。
当Windows CMD处理此if
语句时
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%
)
它会在执行完整语句之前扩展所有变量,例如以下行
echo profile is %profile%, token_user_is %token_user%
将使用在语句之前定义的profile
和的值。token_user
if
您的代码需要使用同一语句中at 之前输入的值来扩展命令%profile%
。为此,您需要使用而不是进行延迟扩展。要使用延迟扩展,必须使用 来启用它。echo
set /P profile=...
if
!profile!
%profile%
setlocal enabledelayedexpansion
修改后的脚本
setlocal enabledelayedexpansion
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%
)
在问题的例子中,延迟扩展仅对 是必要的profile
。如果您不想更改语句token_user
中的 的值if
,则不需要!token_user!
对此变量进行延迟扩展( ),但它也可以用于
echo profile is !profile!, token_user is !token_user!