Неустановленное значение переменной, назначенное в операторе if внутри вложенного цикла for - PullRequest
0 голосов
/ 08 марта 2019

Я пытаюсь создать один пакетный файл для чтения параметров из файла и передать его на ant для развертывания.

Я создал приведенный ниже пакетный файл:

setlocal enabledelayedexpansion
echo on

IF EXIST "D:\testfile1.txt" (
    echo Do one thing

    set string=
    set /p string=< D:\testfile1.txt
    echo value taken from file is %string

    for /f "tokens=2,4,6 delims==:" %%G IN ("%string%") DO (

        echo %%G %%H %%I
        set env=%%G
        set dom=%%H
        set com=%%I
        echo ENV !env!
        echo DOM !dom!
        echo COM !com!


        cd D:\kpn_eai\EAI_FIXED\branches\kpn_eai_fixed\fixed\build\scripts

        %ANT_HOME%\bin\xanteai deploy %%G %%H %%I

    )
) ELSE (
    echo Do another thing
)

endlocal

В testfile1.txt У меня есть параметры в следующем формате:

Environment=Env_Name1:Domain=Domain_Name1:Component=Component_name1

Параметры - это различные варианты развертывания.Когда я запускаю приведенный выше код, он выдает следующее:

D:\>echo off
Do one thing Ant home is C:\tibco\ant\apache-ant-1.9.13
value taken from file is Environment=Env_name1:Domain=Domain_Name1:Component=Component_name1
Env_name1 Domain_Name1 Component_name1
ENV Env_name1
DOM Domain_Name1
COM Component_name1

После этого начинается развертывание.

Проблема, с которой я сталкиваюсь, заключается в том, что я запускаю этот код для других параметров testfile1.txt) значения ENV, DOM и COM остаются неизменными независимо от параметров, считанных из testfile1.txt.

Может кто-нибудь помочь мне исправить этот код и сообщить, как я могу просто присвоить значения, считанные из файла, переменной и передать ее ant для развертывания?

ПРИМЕЧАНИЕ: -Этот пакетный файл будет помещен в планировщик, который будет проверять наличие testfile1.txt через каждые 5 минут, когда обнаружит, что запускается процесс развертывания файла.Таким образом я включил условие if для проверки наличия файла.

Ответы [ 2 ]

1 голос
/ 08 марта 2019

На самом деле не должно быть никакой необходимости set звонить или echo писать все по ходу дела, так почему бы просто не сделать что-то подобное вместо этого:

@Echo Off
If Exist "testfile1.txt" (Set /P "string="<"testfile1.txt"
    SetLocal EnableDelayedExpansion
    Echo value taken from file is !string!
    For /F "Tokens=2,4,6 Delims==:" %%A In ("!string!") Do (
        CD /D "D:\kpn_eai\EAI_FIXED\branches\kpn_eai_fixed\fixed\build\scripts"
        "%ANT_HOME%\bin\xanteai" deploy %%A %%B %%C)
    EndLocal) Else Echo Do another thing
0 голосов
/ 08 марта 2019

Вы можете сначала разбить строку чтения в двоеточии с помощью простого for и
получить имена переменных env,dom,com из содержимого.

Здесь перед ним подчеркивание для облегчения вывода.

:: Q:\Test\2019\03\08\SO_55061545_.cmd
@echo off
setlocal enabledelayedexpansion
set "FileIn=D:\testfile1.txt"

IF not EXIST "%FileIn%" (
    echo Do another thing
    Goto :somewhere
)

echo Do one thing
set "string="
set /p "string="<"%FileIn%"
echo value taken from file is %string%

for %%A in ("%string::=" "%") do for /f "tokens=1* delims==" %%B IN ("%%~A") DO (
    echo %%A %%B %%C
    set var=%%B
    set "_!var:~0,3!=%%C"
)
set _

:: cd D:\kpn_eai\EAI_FIXED\branches\kpn_eai_fixed\fixed\build\scripts
:: %ANT_HOME%\bin\xanteai deploy %_env% %_dom% %_com%

endlocal

:somewhere

>  SO_55061545_.cmd
Do one thing
value taken from file is Environment=Env_Name1:Domain=Domain_Name1:Component=Component_name1
"Environment=Env_Name1" Environment Env_Name1
"Domain=Domain_Name1" Domain Domain_Name1
"Component=Component_name1" Component Component_name1
_Com=Component_name1
_Dom=Domain_Name1
_Env=Env_Name1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...