为什么在 `set /P profile="sas-admin profile:"` 之后 `%profile%` 的值不能立即可用?

为什么在 `set /P profile="sas-admin profile:"` 之后 `%profile%` 的值不能立即可用?

我有一个批处理 ( *.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_1profile_1,它会回显

profile is , token_user_is token_1

如果我再次运行它并输入token_2profile_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_userif

您的代码需要使用同一语句中at 之前输入的值来扩展命令%profile%。为此,您需要使用而不是进行延迟扩展。要使用延迟扩展,必须使用 来启用它。echoset /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!

相关内容