У меня есть партия (*.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
утверждение.
Ваш код требует расширения %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!