Batch file 取消设置嵌套for循环中if语句中指定的变量值

Batch file 取消设置嵌套for循环中if语句中指定的变量值,batch-file,for-loop,if-statement,Batch File,For Loop,If Statement,我试图创建一个批处理文件,从文件中读取参数并将其传递给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 /

我试图创建一个批处理文件,从文件中读取参数并将其传递给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
参数是不同的部署。当我运行上面的代码时,它给出了下面的输出

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进行部署


注意:-此批处理文件将放置在调度程序中,当它发现触发文件部署过程时,每5分钟检查一次testfile1.txt。因此,我已经包括了检查文件可用性的if条件。

您可以首先使用简单的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

真的不需要在运行过程中设置或回显所有内容,所以为什么不这样做:

@回音
如果Exist testfile1.txt Set/P string=为什么您认为只有env/dom/com需要代码块中的感叹号?这也适用于var!一串如果不存在,只需反转if逻辑,然后退出批处理文件,因此不需要任何代码块。@LotPings在不了解上下文的情况下,我不会说反转条件是一个好建议。OP可能想做另一件事而不是退出。您提供的输出不是您发布的批处理文件的结果@montonero好吧,第一个选择是正确使用延迟扩张。第二,你是对的,如果可能的话,我只是想绕开一个转到,但这取决于OP。反转if语句的想法实际上对我有效。。。是的,我不熟悉批处理编码,这就是为什么我不确定如何正确使用SET enabledayedexpansion。顺便说一句,非常感谢你的帮助。@LotPings我不太明白你为什么需要goto,否则就好了,干净多了。代码块使代码更具可读性。@montonero如果使用得当是的。我倾向于先处理较短的条件,这样程序流更清晰,可以避免代码块的过度嵌套。但这只是我个人的偏好。您肯定知道delayedexpansion是最常出现的问题。@LotPings可以肯定延迟扩展在批处理脚本中不是最常见的功能。在if语句中设置EnableDelayedExpansion的作用域将仅在if块中正确吗?在我的代码中,在删除我用作跟踪的标记的所有回显后值,我的代码看起来是一样的,尽管我没有在if语句中设置EnableDelayedExpansion是,因为我将您的需求理解为“如何分配要传递给ant的值”。一旦它们被传递,您就不再需要它们了,因此EndLocal会将它们从环境中删除。哦,顺便说一句,你的代码几乎是一样的,只是你需要学习正确使用双引号,还要确保你在CD命令中使用/D选项。您已经回避的主要问题是,您需要在正确的时间启用延迟扩展,这就是我在上面演示的。
:: 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