Почему значение `% profile%` не доступно сразу после `set / P profile =« sas-admin 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_1 а также profile_1, это перекликается

profile is , token_user_is token_1

Если я снова запущу его и введу token_2 а также profile_2, это перекликается

profile is profile_1, token_user_is token_2

Чем это объясняется и как это вылечить?

1 ответ
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 утверждение.

Ваш код требует расширения %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!

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *