IF 和 ELSE 在 dos 中同时发生

IF 和 ELSE 在 dos 中同时发生

我无法弄清楚为什么 IF 和 ELSE 同时满足条件。

@echo off
    setlocal enabledelayedexpansion enableextensions

    Set filename=Credit_Limits\Input\BR_Credit_Limit_Upload.csv
    if exist %filename% (
        FOR /F "tokens=1-3* delims=," %%A IN (%filename%) DO ( 
                  if %%~A == External_ID_vod__c (
                    if %%~B == M_NA_BR_Credit_Limit_CU__c (
                        if %%~C == CurrencyISOCode (
                            echo good
                        )
                    )
                  )   
                  goto :break
                )
        )
        :break      
    ) else (
        echo file doesn't exist
    )

我总是得到以下输出:

good 
file doesn't exist

答案1

第一的:您的代码中有一个多余的)右括号;简化的示例:

@ECHO OFF
SETLOCAL EnableExtensions EnableDelayedExpansion
if 1==1 (
  echo good
  )
) else (
  echo file doesn't exist
)

输出:

==> D:\bat\SU\993931.bat
good
file doesn't exist

第二: 作为基本规则,绝不在括号内的命令块中使用:labelnor 。有关证明和示例,请阅读:: label-like comment()

最后, 作为

  • %%~A或者%%~B可能%%~C包含一些cmd 应该转义的有害字符, 或者
  • %%~B或者%%~C可能导致空字符串(尝试if == A echo any),

使用(再次作为一般规则)正确的双引号如下:

              if "%%~A" == "External_ID_vod__c" (
                if "%%~B" == "M_NA_BR_Credit_Limit_CU__c" (
                    if "%%~C" == "CurrencyISOCode" (

答案2

条件满足后,您的 FOR 循环仍在运行。它满足条件,输出“good”,继续运行下一个周期的循环,然后再次满足条件,结果为 false,并给出“文件不存在”的输出。

您应该在 FOR 循环中添加一个条件,使代码在达到真实条件的结果中退出循环,或者添加一个 goto,以便在满足真实条件时绕过虚假条件。

答案3

另一个选择可能是不使用 ELSE 语句。以下示例使用的括号比之前的示例代码少,但应该是等效的。

@Echo Off
SETLOCAL EnableExtensions EnableDelayedExpansion

Set filename=Credit_Limits\Input\BR_Credit_Limit_Upload.csv
if NOT exist %filename% goto nofile

FOR /F "tokens=1-3* delims=," %%A IN (%filename%) DO (
    if "%%~A" == "External_ID_vod__c" if "%%~C" == "CurrencyISOCode" (
        if "%%~B" == "M_NA_BR_Credit_Limit_CU__c" echo good
    )
)    
goto done

:nofile
echo File doesn't exist

:done

相关内容